【问题标题】:How to use an endpoint with multiple body params and fileupload in FastAPI?如何在 FastAPI 中使用具有多个主体参数和文件上传的端点?
【发布时间】:2021-08-16 03:12:07
【问题描述】:

我有一个存储文件和附加信息的应用程序,例如作者,cmets DB。我可以将文件传递给 FastAPI,但通过将其与参数一起传递会出现问题。

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

我在 FastAPI 端点中尝试了 2 个定义

选项 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 Unprocessable Entity

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

这两个选项都无法通过 swagger 进行测试,我得到了回应:value is not a valid dict。数据对我来说看起来不错,但也许我遗漏了一些东西。

好像是客户端代码有问题,还有我试了好几次都没有成功。

提前感谢您的支持!

适合我的解决方案

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

【问题讨论】:

  • 我尝试通过 data={'params': ''} 并以某种方式返回 200
  • 这对我不起作用。然而,您的评论帮助我从另一个角度思考这个问题。谢谢!

标签: python python-3.x post fastapi


【解决方案1】:

根据this issue,我认为这是一个 HTTP 限制,我们必须使用 application/jsonmultipart/formdata,但不能同时使用两者。由于我们正在上传文件,因此必须使用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

我认为您也可以使用查询参数

【讨论】:

  • 感谢您的帮助。我在帖子中添加了信息。我最初使用的客户端代码现在正在使用选项 2。问题在于参数的顺序。
猜你喜欢
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2022-11-20
  • 2022-12-31
  • 2022-12-31
  • 2020-11-12
  • 2013-03-09
  • 2023-02-09
相关资源
最近更新 更多