【问题标题】:How to send multiple files with Python requests to FastAPI server?如何将带有 Python 请求的多个文件发送到 FastAPI 服务器?
【发布时间】:2022-04-28 16:27:50
【问题描述】:

我的 FastAPI 服务器中有以下端点:

@app.post("/submit")
async def submit(file1: List[UploadFile] = File(...), file2: List[UploadFile] = File(...), file3: List[UploadFile] = File(...)):
    # do something
    return 'hello'

如果我使用 Swagger UI,它会按预期工作。但是,我无法弄清楚如何使用 Python requests 模块向此端点发送 POST 请求。这是我尝试过的:

import requests

headers = {
    'accept': 'application/json',
    'Content-Type': 'multipart/form-data',
}

files = [
    ('file1', open('file1.zip', 'rb')), 
    ('file2', open('file2.txt', 'rb')),
    ('file3', open('file3.rar', 'rb')),
]

response = requests.post('http://localhost:8000/submit', headers=headers, files=files)

print(response.text)

但我收到一个错误:

{"detail":"There was an error parsing the body"}

【问题讨论】:

    标签: python python-requests fastapi


    【解决方案1】:

    您应该将每个file 定义为端点中的单独参数,例如file1: UploadFile = File(...)file2: UploadFile = File(...) 等(不使用List),或者最好定义一个List 文件使用files: List[UploadFile] = File(...),如下图(下图可用于返回所有上传文件的文件名)。

    @app.post("/submit")
    async def submitUPP(files: List[UploadFile] = File(...)):
        # do something
        return {"Uploaded Files:": [file.filename for file in files]}
    

    在客户端,您应该为每个文件使用您在端点中提供的相同key(即上述案例中的files)发送文件列表。

    files = [
        ('files', open('file1.zip', 'rb')), 
        ('files', open('file2.txt', 'rb')),
        ('files', open('file3.rar', 'rb')),
    ]
    

    您可能还想看看thisthis 的答案。

    重要

    除上述之外,不应在标题中设置Content-Type 使用文件时改为multipart/form-data,而是让Python请求设置Content-Type,因为除了multipart/form-data之外,Content-Type必须包括用于分隔每个正文部分的boundary字符串在多部分有效载荷中)。请查看答案herehere。以您的方式设置Content-Type是您遇到错误的原因,即{'detail': 'There was an error parsing the body'}。因此,您应该避免在标题中设置Content-Type

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 2022-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多