跳到内容

表单数据

当你需要接收表单字段而不是 JSON 时,可以使用 Form

注意

要使用表单,请先安装 python-multipart

确保你创建了一个 虚拟环境,激活它,然后进行安装,例如

$ pip install python-multipart

导入 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}
🤓 其他版本和变体

提示

如果可能,请优先使用 Annotated 版本。

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
    return {"username": username}

定义 Form 参数

创建表单参数的方式与创建 BodyQuery 的方式相同。

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}
🤓 其他版本和变体

提示

如果可能,请优先使用 Annotated 版本。

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
    return {"username": username}

例如,在 OAuth2 规范的使用方式之一(称为“密码流”)中,要求以表单字段的形式发送 usernamepassword

规范要求字段必须精确命名为 usernamepassword,并且以表单字段而非 JSON 的形式发送。

使用 Form,你可以声明与 Body(以及 QueryPathCookie)相同的配置,包括验证、示例、别名(例如使用 user-name 代替 username)等。

注意

Form 是一个直接继承自 Body 的类。

提示

要声明表单主体,你需要显式使用 Form,否则参数会被解释为查询参数或主体(JSON)参数。

关于“表单字段”

HTML 表单 (<form></form>) 向服务器发送数据的方式通常使用一种“特殊”编码,这与 JSON 不同。

FastAPI 将确保从正确的地方读取这些数据,而不是从 JSON 中读取。

技术细节

表单数据通常使用“媒体类型” application/x-www-form-urlencoded 进行编码。

但当表单包含文件时,它会被编码为 multipart/form-data。你将在下一章中阅读有关处理文件的内容。

如果你想了解更多关于这些编码和表单字段的信息,请前往 MDN 关于 POST 的 Web 文档

警告

你可以在路径操作中声明多个 Form 参数,但不能同时声明预期接收为 JSON 的 Body 字段,因为请求体将使用 application/x-www-form-urlencoded 而不是 application/json 进行编码。

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

回顾

使用 Form 来声明表单数据输入参数。