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
相关产品推荐
相关产品推荐

