如何在FastAPI中使用具有多个body参数和fileupload的端点?

2024-03-28 18:23:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个存储文件和其他信息的应用程序,例如作者、评论数据库。我可以将一个文件传递给FastAPI,但通过将其与参数一起传递会产生问题

我检查了下面的问题How to add multiple body params with fileupload in FastAPI?和这个问题[QUESTION] Use UploadFile in Pydantic model #657 ,但没有成功

我在FastAPI端点中尝试了两种定义

选项1

class Properties(BaseModel):
   language: Optional[str] = None
   author: Optional[str] = None

@app.post("/uploadfile/")
async def uploadfile(params: Properties, file: UploadFile = File(...)):
    #internal logic

选项2

@app.post("/uploadfile/")
async def uploadfile(file: UploadFile = File(...),
                         language: str = Form(...),
                         author: Optional[str] = Form(None)):
   #internal logic

客户端代码: 以下代码用于客户端,但两个选项的响应都是422不可处理实体

with open(path, 'rb') as f:
     response = requests.post('http://localhost:8005/uploadfile/', data={'language':'en', 
     'author':'me'}, files={'file': f})

这两个选项都无法从swagger测试,我得到的回答是:值不是有效的dict。数据对我来说很好,但也许我遗漏了什么

似乎客户端代码是错误的,但我也尝试了一些更改,但没有成功

提前感谢您的支持

适合我的解决方案

正如“Dilyor博士”在他的评论中所写,我使用了选项2,因为我们正在发送文件。我的问题在争论的顺序之内。更换后,一切都开始工作


Tags: 文件代码none客户端选项评论postlanguage
1条回答
网友
1楼 · 发布于 2024-03-28 18:23:29

根据this issue,在我看来这是一个HTTP限制,我们必须要么使用application/json要么使用multipart/formdata,但不能同时使用两者。因为我们正在上传文件,所以必须使用^。这段代码(以某种方式)起作用:

@app.post("/uploadfile/")
async def uploadfile(author: Optional[str] = Form(...),
                     language: Optional[str] = Form(...),
                     file: UploadFile = File(...)):

我试了一下 curl http://localhost:8000/uploadfile/ -X POST -F author=me -F language=en -F file=@/path/to/file,不确定requests

我想您也可以使用查询参数

相关问题 更多 >