首页 > 编程问答 >如何在 FastAPI 中同时接收 JSON 数据和文件上传

如何在 FastAPI 中同时接收 JSON 数据和文件上传

时间:2024-07-31 13:20:35浏览次数:5  
标签:python https postman backend fastapi

我正在开发一个 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}

解释:

  1. 分离文件和JSON数据: 我们不再使用 Form(...) ,而是使用 File(...) 来接收上传的文件,并使用 Body(...) 来接收JSON格式的 TaskCreate 数据。
  2. 使用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

相关文章

  • 蓝桥Python组标准库collections(1)
    collections一、Counter:计数器可以直接对列表统计每个元素的出现次数可以统计字符串每个字符的出现次数fromcollectionsimportCounter#计数器a=['arr','arr','brr','crr','arr']b=Counter(a)print(b)print(type(b))print(b['arr']......
  • 蓝桥Python组标准库collections(2)
    collections三、defaultdict:有默认值的字典在字典中获取一个key有两种方法第一种get第二种通过[]获取.使用dict时,如果引用的key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict。fromcollectionsimportdefaultdictd=default......
  • 基于python电商个性化推荐系统【源码+文档+PPT】
    精彩专栏推荐订阅:在下方专栏......
  • 探索 Python 的广泛应用:从开发到数据科学
    目录引言Python的发展历史Python的特点Python在Web开发中的应用Django框架Flask框架其他Web框架Python在数据科学中的应用数据分析机器学习深度学习Python在自动化和脚本编写中的应用系统管理和自动化网络爬虫Python在游戏开发中的应用PygamePython在......
  • 碰撞检测 | 矩形增量膨胀安全走廊模型(附C++/Python仿真)
    目录0专栏介绍1安全走廊建模的动机2矩形增量膨胀算法3算法仿真3.1C++实现3.2Python实现0专栏介绍......
  • python - 构建奇点容器时在 pyproject.toml 中找不到 [tool.poetry] 部分
    我正在尝试构建一个在HPC环境上运行的奇点容器。我正在使用poetry来管理python包。我的pyproject.toml文件的内容如下:[tool.poetry]name="haqc"version="0.1.0"description=""authors=["VivekKatial<[email protected]>"......
  • 如何在Python中处理FileNotFoundException
    我有一个函数可以从路径读取avro文件(按日文件夹)并将其写入相同的路径(聚合到按月的文件夹)。如果文件夹有.avro文件,该函数可以正常工作。但如果文件夹为空,我会收到错误。java.io.FileNotFoundException:Noavrofilesfound.Iffilesdon'thave.avroextension,set......
  • 有谁知道如何在 ROS 中使用 python 开发赛车模拟编码?
    在模拟中,主要目标是让自动驾驶汽车读取AprilTags并根据标牌提供的说明进行导航。AprilTags是一种基准标记,可作为重要的视觉提示,传达有关汽车周围环境的信息,例如方向、速度限制和其他关键路标。汽车的车载视觉系统应该检测这些标签,解码嵌入的数据,并相应地调整其运动。这包括在......
  • python实现提取视频帧的图片
    文章目录1、需求痛点2、完整代码⭐3、代码分析3.1、需要改动的地方3.2、OpenCV库的使用3.3、多线程技术4、执行效率5、效果展示⭐6、注意事项......
  • 三种语言实现差分(C++/Python/Java)
    题目输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l,r,c表示将序列中[l,r]之间的每个数加上c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数序列。接下来m行,每行包含三个整数l,r,c,表......