【问题标题】:Fastapi Multipart/form data error: required fieldsFastapi Multipart/form 数据错误:必填字段
【发布时间】:2021-08-22 18:54:21
【问题描述】:

我有 pydantic 模型,例如:

class Banner:
    title: str
    text: str

路线

@router.post('', status_code=201)
async def create_banner(
    banner: Banner,
    photo: UploadFile = File(...)  # multipart/form-data

):
    return await Banners.create(banner.dict())

但是 fastapi 返回奇怪的错误。

所以你可以看到,我发送了我的文本,但框架没有看到它们

【问题讨论】:

  • 您可能需要发送格式为 JSON 的 JSON 数据:{"banner": {"title": "bar", "text": "foo"}。您还可以通过在 JSON iirc 之后附加 ; type=application/json 来附加 JSON 本身的内容类型。

标签: python multipartform-data fastapi pydantic


【解决方案1】:

根据FastAPI docs

可以在一个路径操作中声明多个FileForm参数, 但您也不能声明您希望收到的 Body 字段 JSON,因为请求将使用编码的正文 multipart/form-data 而不是 application/json

这不是 FastAPI 的限制,它是 HTTP 协议的一部分。

并且当传递一个对象时,FastAPI 会尝试将其视为一个主体规范,而不是一个表单字段。这意味着,您必须将 banner 参数显式定义为表单字段:

@router.post('', status_code=201)
async def create_banner(
    banner: Banner = Form(...),
    photo: UploadFile = File(...)  # multipart/form-data

):
    return await Banners.create(banner.dict())

还要确保您的 Banner 对象是有效的 pydantic 模型,因为 FastAPI 在这种情况下无法正确识别裸对象。

【讨论】:

【解决方案2】:

更新

更多选项可以在here找到。

原答案: 这是dublicate question。简而言之,you can't 拥有 Pydantic 模型和Form(和/或File)数据。您可以使用Form 字段,将数据作为form 数据发送到正文中,或者使用Dependencies 使用Pydantic 模型,将数据作为query 参数发送。下面的例子。

@router.post("/")
async def create_banner(title: str = Form(...), text: str = Form(...), photo: UploadFile = File(...)):
        return {"JSON Payload ": {"title": title, "text": text}, "Uploaded Filename": photo.filename}

from pydantic import BaseModel
from fastapi import Depends

class Banner(BaseModel):
    title: str
    text: str

@router.post("/")
async def create_banner(banner: Banner = Depends(), photo: UploadFile = File(...)):
    return {"JSON Payload ": banner.dict(), "Uploaded Filename": photo.filename}

【讨论】:

    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多