当前位置: 首页 > 知识库问答 >
问题:

如何在FastAPI中使用具有多个主体参数和文件上传的endpoint?

姬承教
2023-03-14

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

我检查了以下问题 如何在 FastAPI 中使用文件上传添加多个正文参数?和这个问题 [问题] 在 Pydantic 模型 #657 中使用上传文件但没有成功。

我在FastAPIendpoint中尝试了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不可处理实体。

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

两个选项都不能通过swagger测试,我得到的回答是:value不是一个有效的字典。数据看起来对我有利,但也许我遗漏了什么。

似乎客户端代码是错误的,但也有我尝试了几次改变没有成功。

提前感谢您的支持!

适合我的解决方案

正如“Drdilyor”在他的评论中所写,我在发送文件时使用了选项2。我的问题是有争议的。更换后,一切都开始运转。

共有1个答案

慕铭
2023-03-14

根据这个问题,在我看来这是一个HTTP限制,我们必须使用application/jsonmultipart/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 作者=me -F 语言=en -F file=@/path/to/file进行了测试,不确定请求

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

 类似资料:
  • 我有一个使用FastAPI部署的机器学习模型,但问题是我需要该模型采用两体参数 当我试图发送输入参数时,我在邮递员中遇到了一个错误,请参见下面的图片,

  • 我正在使用以下接受多个文件的FastAPIendpoint: 我想先输入参数,然后输入列表,但我找不到执行有效 post 请求的方法: 如果我只上传作为元组工作列表,但我不知道如何传入参数。

  • 问题内容: 这是我上传多个文件的代码: HTML代码: 密码: 但是它会上传单个文件,而不是多个文件。 问题答案: 在模板中,你需要在上传输入中添加属性: 然后在查看功能中,上传的文件可以通过列表获取。循环此列表并在每个项目上调用save()方法将它们保存在给定路径中: 此外,你可能需要使用secure_filename()来清洁文件名: 你也可以使用此方法生成随机文件名。 完整演示 视图: im

  • 我试图理解以下文档: Transferutility.UploadDirectory null null null

  • 但是如何为多个文件做呢? PS.在webflux中有没有另一种上传一组文件的方法?

  • 我正在尝试使用DropZone上载多个文件。但在控制器中检索文件名时出现问题。请帮我找出哪里出了错。我已经在下面发布了我的代码。 DropZone的HTML代码: 脚本文件,用于: 在控制器actionCreate()方法中: 当我在拖放框中添加图片并点击提交按钮时,拖放框中的图片显示成功结果。但是当我试着打印$模型的时候-