我正在开发一个 FastAPI 项目,我需要在同一请求中接收 JSON 数据和文件上传。具体来说,我需要在 JSON 数据中传递整数数组,同时上传文件。这是我的请求正文的样子:
- 标题(字符串)
- 描述(字符串)
- 评论(字符串)
- due_date(日期)
- 优先级(字符串)
- signed_to(数组)整数)
- 文件(文件上传)
我无法让 FastAPI 在单个请求中接受这种类型的混合数据。这是我当前的方法:
from fastapi import FastAPI, File, UploadFile, Form
from pydantic import BaseModel
from typing import List
import datetime
app = FastAPI()
class TaskCreate(BaseModel):
title: str
description: str
comments: str
due_date: datetime.date
priority: str
assigned_to: List[int]
@app.post("/tasks/")
async def create_task(
title: str = Form(...),
description: str = Form(...),
comments: str = Form(...),
due_date: datetime.date = Form(...),
priority: str = Form(...),
assigned_to: List[int] = Form(...),
file: UploadFile = File(...)
):
return {"title": title, "description": description, "comments": comments, "due_date": due_date, "priority": priority, "assigned_to": assigned_to, "file_name": file.filename}
当使用 Form(...) 发送时,signed_to 参数似乎不接受整数数组。 FastAPI 会抛出错误,因为它不支持表单数据中的列表。
我需要一种方法来在同一请求中发送 JSON 数据(包括整数数组)和文件,并让 FastAPI 正确处理它。在 FastAPI 中实现这一目标的最佳方法是什么?
你遇到的问题是因为HTML表单默认不支持直接发送数组数据。在FastAPI中,你可以结合使用
File
和
Body
来解决这个问题,方法是将文件上传和JSON数据分别处理。
修改后的代码:
from fastapi import FastAPI, File, UploadFile, Body
from pydantic import BaseModel
from typing import List
import datetime
app = FastAPI()
class TaskCreate(BaseModel):
title: str
description: str
comments: str
due_date: datetime.date
priority: str
assigned_to: List[int]
@app.post("/tasks/")
async def create_task(
file: UploadFile = File(...),
task_data: TaskCreate = Body(...)
):
return {"file_name": file.filename, "task_data": task_data}
解释:
-
分离文件和JSON数据:
我们不再使用
Form(...)
,而是使用File(...)
来接收上传的文件,并使用Body(...)
来接收JSON格式的TaskCreate
数据。 -
使用Pydantic模型:
我们定义了
TaskCreate
模型,用于验证和解析JSON数据,确保assigned_to
字段是整数数组。
发送请求:
你需要使用工具或库发送包含文件和JSON数据的multipart/form-data请求。 以下是一个使用
curl
的例子:
curl -X POST \
http://localhost:8000/tasks/ \
-H 'Content-Type: multipart/form-data' \
-F 'file=@/path/to/your/file.txt' \
-F 'task_data={"title": "Task Title", "description": "Task Description", "comments": "Some comments", "due_date": "2024-01-01", "priority": "High", "assigned_to": [1, 2, 3]}'
注意:
-
-F 'task_data=...'
: 将JSON数据作为字符串传递,FastAPI会自动将其解析为TaskCreate
对象。 -
请将
/path/to/your/file.txt
替换为你的实际文件路径。
通过这种方法,你可以同时接收文件上传和包含整数数组的JSON数据,并利用FastAPI的强大功能进行处理。
标签:python,https,postman,backend,fastapi From: 78814482