Form Data
当需要接受表单字段而不是 JSON 时,可以使用 Form
注:需要借助 python-multipart
来使用表单
使用步骤
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
等的方法一样- 例如在一种 OAuth2 规范(“password flow”)中,需要使用
username
和password
作为表单字段,规范要求字段必须准确命名为username
和password
,并且以表单的形式发送,而不是 JSON Form
可以和Body
,Query
等一样声明元信息和验证参数
- 例如在一种 OAuth2 规范(“password flow”)中,需要使用
注: Form
是继承于 Body
的类
提示:必须用 Form
显示声明表单正文,如果没有显示声明,则会被解释为查询参数或者 body
参数
About “Form Fields”
与 JSON 不同,HTML 表单(<form></form>
)发送通常采用特殊的编码方式发送数据到服务器
FastAPI 将确保从正确的位置读取数据
技术细节:
- 来自表单的数据通常使用 “media type”
application/x-www-form-urlencoded
的方式进行编码 - 但是当表单包含文件的时候,则会以
multipart/form-data
的方式进行编码 - MDN
警告:
- 可以在路径操作中定义多个
Form
参数,但是不能以接受 JSON 的方式去接受表单数据,例如声明Body
字段,因为请求的正文将会以application/x-www-form-urlencoded
方式而不是application/json
方式进行编码 - 这不是 FastAPI 的限制,而是 HTTP 协议的一部分