You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI测试时表单不显示,仅展示JSON示例问题排查

问题原因与解决方案

你的核心问题是直接将Form()注解应用在了整个Pydantic模型上,但Form()只能用于单个表单字段,FastAPI无法自动将表单数据绑定到这种注解方式的模型上。这就导致:

  • Swagger UI(/docs)识别错误,只显示JSON输入选项
  • 提交JSON数据时,接口实际期望的是application/x-www-form-urlencoded格式的表单数据,因此返回422错误

下面提供两种正确实现方式:

方式一:拆分字段为单个Form参数

直接将模型的每个字段单独用Form()注解,之后再组装成Pydantic模型:

from typing import Annotated
from fastapi import FastAPI, Form
from pydantic import BaseModel

app = FastAPI()

class FormData(BaseModel):
    username: str
    password: str

@app.post("/login/")
async def login(
    username: Annotated[str, Form()],
    password: Annotated[str, Form()]
):
    return FormData(username=username, password=password)

方式二:用依赖项封装表单模型(对应官方教程推荐写法)

通过自定义依赖函数,将表单字段转换为Pydantic模型,保持接口参数的简洁性:

from typing import Annotated
from fastapi import FastAPI, Form, Depends
from pydantic import BaseModel

app = FastAPI()

class FormData(BaseModel):
    username: str
    password: str

async def get_form_data(
    username: Annotated[str, Form()],
    password: Annotated[str, Form()]
) -> FormData:
    return FormData(username=username, password=password)

@app.post("/login/")
async def login(data: Annotated[FormData, Depends(get_form_data)]):
    return data

修改后,访问http://127.0.0.1:8000/docs就能看到正常的表单输入界面,提交表单数据也会返回正确结果。

内容的提问来源于stack exchange,提问作者Jilong Yin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:31:03