表单数据¶
当你需要接收表单字段而不是 JSON 时,可以使用 Form
。
导入 Form
¶
从 fastapi
导入 Form
from typing import Annotated
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
return {"username": username}
from fastapi import FastAPI, Form
from typing_extensions import Annotated
app = FastAPI()
@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
return {"username": username}
提示
如果可能,尽量使用 Annotated
版本。
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
return {"username": username}
定义 Form
参数¶
创建表单参数的方式与 Body
或 Query
相同
from typing import Annotated
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
return {"username": username}
from fastapi import FastAPI, Form
from typing_extensions import Annotated
app = FastAPI()
@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
return {"username": username}
提示
如果可能,尽量使用 Annotated
版本。
from fastapi import FastAPI, Form
app = FastAPI()
@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
return {"username": username}
例如,在 OAuth2 规范的一种使用方式(称为“密码流程”)中,需要发送 username
和 password
作为表单字段。
该 规范 要求字段的名称必须是 username
和 password
,并且必须作为表单字段发送,而不是 JSON。
使用 Form
,你可以声明与 Body
(以及 Query
、Path
、Cookie
)相同的配置,包括验证、示例、别名(例如 user-name
而不是 username
)等。
信息
Form
是直接从 Body
继承的类。
提示
要声明表单主体,你需要显式使用 Form
,因为如果没有它,参数将被解释为查询参数或主体(JSON)参数。
关于“表单字段”¶
HTML 表单(<form></form>
)发送数据到服务器的方式通常使用“特殊”编码来对该数据进行编码,它与 JSON 不同。
FastAPI 将确保从正确的位置读取数据,而不是 JSON。
“技术细节”
表单中的数据通常使用“媒体类型”application/x-www-form-urlencoded
编码。
但是,当表单包含文件时,它将被编码为 multipart/form-data
。你将在下一章中了解如何处理文件。
如果你想了解更多关于这些编码和表单字段的信息,请访问 MDN 关于 POST
的网页文档.
警告
你可以在一个路径操作中声明多个 Form
参数,但不能再声明你期望作为 JSON 接收的 Body
字段,因为请求将使用 application/x-www-form-urlencoded
而不是 application/json
对主体进行编码。
这不是 FastAPI 的限制,而是 HTTP 协议的一部分。
回顾¶
使用 Form
声明表单数据输入参数。