0%

FastAPI自学教程(21) - 表单数据处理

1. 基础表单处理

1
2
3
4
5
6
7
from fastapi import FastAPI, Form

app = FastAPI()

@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
return {"username": username}
  • 必须安装 python-multipart 依赖:pip install python-multipart
  • 使用 Form() 显式声明表单字段,否则参数会被识别为查询参数
  • 支持与 Body 相同的元数据和验证规则(如字段别名、示例等)

2. 数据验证机制

1
2
3
4
5
6
7
@app.post("/register/")
async def register(
username: str = Form(min_length=4, max_length=20),
password: str = Form(regex="^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$"),
age: int = Form(gt=18, lt=100)
):
return {"username": username}
  • 支持类型转换(如字符串转整型)和边界验证(gt/lt
  • 正则表达式验证(如密码复杂度规则)
  • 自动返回422错误和验证失败详情

3. 模型化表单处理

1
2
3
4
5
6
7
8
9
from pydantic import BaseModel, Field

class LoginForm(BaseModel):
username: str = Field(..., min_length=4)
password: str = Field(..., min_length=6)

@app.post("/model-login/")
async def model_login(form: LoginForm = Depends()):
return form.dict()
  • FastAPI 0.115.0+ 支持使用Pydantic模型(需搭配 Depends
  • 模型字段自动映射到表单参数,支持复杂嵌套结构
  • 可通过 model_config = {"extra": "forbid"} 禁止额外字段

4. 文件与表单混合处理

1
2
3
4
5
6
7
8
9
10
11
12
from fastapi import File, UploadFile

@app.post("/upload/")
async def upload_file(
file: UploadFile = File(...),
description: str = Form(...)
):
return {
"filename": file.filename,
"size": len(await file.read()),
"description": description
}
  • 使用 multipart/form-data 编码格式
  • UploadFile 类型支持大文件流式传输
  • 禁止同时使用 FormBody(HTTP协议限制)

5. 特殊场景处理

1
2
3
4
5
6
from fastapi import Request

@app.post("/raw-form/")
async def raw_form(request: Request):
form_data = await request.form()
return dict(form_data)
  • 通过 request.form() 获取原始表单数据
  • 使用 **kwargs 接收未知字段(需谨慎处理安全性)
  • 支持将表单数据转换为字典格式

注意事项

  1. 表单字段名需与HTML表单的name属性一致
  2. 生产环境建议使用HTTPS传输敏感数据(如密码)
  3. 文档测试需手动设置application/x-www-form-urlencoded格式