我正在尝试进行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"}]}
正如你所看到的,我试图同时传递一个file
和request body
。我想如果把payload['context']
转换成JSON,我可以解决这个问题。但是我想在服务器端解决这个问题。
我该如何修正这个错误?也许在参数传入视图之前转换一些参数,或者类似的东西?
1条答案
按热度按时间o3imoua41#
在发送请求之前,您需要在客户端使用
json.dumps()
序列化JSON。此外,您实际上不需要将filename
和content_type
等元数据作为JSON有效负载的一部分发送。(您可以自定义)和content_type
,您可以稍后在服务器端使用UploadFile
属性检索它们。该content_type
(或mime type
)不应该是application/excel
,但是,如here和here所述,应该是application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
。最后,我还建议您看一下此答案,这解释了不能同时提交form-data
/files
和JSON
的原因,并提供了允许同时提交这两种数据并验证JSON数据的解决方案-在您的情况下,JSON数据不会针对Pydantic模型进行验证,这意味着客户机可以发送任何类型的数据或省略任何required
属性。应用程序.py
测试.py