Published

表单数据

FastAPI framework, high performance, easy to learn, fast to code, ready for production We just scratched the surface, but you already get the idea of how it all works...

表单数据

接收的不是 JSON,而是表单字段时,要使用 Form

!!! info "说明"

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

例如,pip install python-multipart

导入 Form

fastapi 导入 Form

{!../../../docs_src/request_forms/tutorial001.py!}

定义 Form 参数

创建表单(Form)参数的方式与 BodyQuery 一样:

{!../../../docs_src/request_forms/tutorial001.py!}

例如,OAuth2 规范的 "密码流" 模式规定要通过表单字段发送 usernamepassword

该规范要求字段必须命名为 usernamepassword,并通过表单字段发送,不能用 JSON。

使用 Form 可以声明与 Body (及 QueryPathCookie)相同的元数据和验证。

!!! info "说明"

Form 是直接继承自 Body 的类。

!!! tip "提示"

声明表单体要显式使用 Form ,否则,FastAPI 会把该参数当作查询参数或请求体(JSON)参数。

关于 "表单字段"

与 JSON 不同,HTML 表单(<form></form>)向服务器发送数据通常使用「特殊」的编码。

FastAPI 要确保从正确的位置读取数据,而不是读取 JSON。

!!! note "技术细节"

表单数据的「媒体类型」编码一般为 application/x-www-form-urlencoded

但包含文件的表单编码为 multipart/form-data。文件处理详见下节。

编码和表单字段详见 MDN Web 文档的 POST小节。

!!! warning "警告"

可在一个路径操作中声明多个 Form 参数,但不能同时声明要接收 JSON 的 Body 字段。因为此时请求体的编码是 application/x-www-form-urlencoded,不是 application/json

这不是 FastAPI 的问题,而是 HTTP 协议的规定。

小结

本节介绍了如何使用 Form 声明表单数据输入参数。