FastAPI -如何在HTTP多部分请求中传递字典/JSON数据?

bhmjp9jg  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(432)

我正在尝试进行POST请求:

import requests

files = {'template': open('template.xlsx', 'rb')}
payload = {
    'context': {
        'OUT': 'csv',
        'SHORT': 'short'
    },
    'filename': 'file.xlsx',
    'content_type': 'application/excel'
}

r = requests.post('http://localhost:8000/render', files=files, data=payload)

到FastAPI服务器:

from fastapi import FastAPI, UploadFile, Form
from pydantic import Json

app = FastAPI()

@app.post('/render')
def render(template: UploadFile, context: Json = Form(), filename: str = Form(...), content_type: str = Form(...)):
    # processing
    return "ok"

但是我得到这个错误(422状态代码):

{"detail":[{"loc":["body","context"],"msg":"Invalid JSON","type":"value_error.json"}]}

正如你所看到的,我试图同时传递一个filerequest body。我想如果把payload['context']转换成JSON,我可以解决这个问题。但是我想在服务器端解决这个问题。
我该如何修正这个错误?也许在参数传入视图之前转换一些参数,或者类似的东西?

o3imoua4

o3imoua41#

在发送请求之前,您需要在客户端使用json.dumps()序列化JSON。此外,您实际上不需要将filenamecontent_type等元数据作为JSON有效负载的一部分发送。(您可以自定义)和content_type,您可以稍后在服务器端使用UploadFile属性检索它们。该content_type(或mime type)不应该是application/excel,但是,如herehere所述,应该是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet。最后,我还建议您看一下此答案,这解释了不能同时提交form-data/filesJSON的原因,并提供了允许同时提交这两种数据并验证JSON数据的解决方案-在您的情况下,JSON数据不会针对Pydantic模型进行验证,这意味着客户机可以发送任何类型的数据或省略任何required属性。

应用程序.py

from fastapi import FastAPI, UploadFile, Form, File
from pydantic import Json

app = FastAPI()

@app.post('/render')
def render(file: UploadFile = File(...), context: Json = Form()):
    print(context, context['OUT'], file.filename, file.content_type, sep="\n")
    return "ok"

测试.py

import requests
import json

url = 'http://localhost:8000/render'
files = {'file': ('file.xlsx', open('template.xlsx', 'rb'), 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')}
payload = {'context': json.dumps({'OUT': 'csv','SHORT': 'short'})}
r = requests.post(url, files=files, data=payload)
print(r.json())

相关问题