推荐答案
在 FastAPI 中处理表单数据可以通过 Form
类来实现。首先需要从 fastapi
导入 Form
,然后在路由处理函数中定义参数并使用 Form(...)
来声明表单字段。以下是一个简单的示例:
from fastapi import FastAPI, Form app = FastAPI() @app.post("/login/") async def login(username: str = Form(...), password: str = Form(...)): return {"username": username}
在这个示例中,username
和 password
是从表单中提取的两个字段。Form(...)
表示这些字段是必填的。
本题详细解读
1. 导入 Form
要处理表单数据,首先需要从 fastapi
导入 Form
类:
from fastapi import Form
2. 定义路由处理函数
在路由处理函数中,使用 Form(...)
来声明表单字段。Form(...)
中的 ...
表示该字段是必填的。如果字段是可选的,可以使用 Form(None)
或 Form(default_value)
。
@app.post("/login/") async def login(username: str = Form(...), password: str = Form(...)): return {"username": username}
3. 表单数据的处理
FastAPI 会自动解析请求体中的表单数据,并将其转换为 Python 类型。在上面的示例中,username
和 password
是从表单中提取的字符串。
4. 表单数据的验证
FastAPI 会自动验证表单数据的类型和必填性。如果表单数据不符合要求,FastAPI 会返回一个 422 Unprocessable Entity 错误,并附带详细的错误信息。
5. 处理文件上传
如果需要处理文件上传,可以使用 File
和 UploadFile
类。例如:
from fastapi import File, UploadFile @app.post("/uploadfile/") async def create_upload_file(file: UploadFile = File(...)): return {"filename": file.filename}
在这个示例中,file
是一个上传的文件对象,可以通过 file.filename
获取文件名。
6. 表单数据的嵌套
FastAPI 还支持处理嵌套的表单数据。例如,可以使用 Pydantic 模型来定义复杂的表单结构:
-- -------------------- ---- ------- ---- -------- ------ --------- ----- --------------------- --------- --- --------- --- -------------------- ----- --- ----------- --------- - ----------- ------ ------------ --------------
在这个示例中,UserLogin
是一个 Pydantic 模型,用于定义表单数据的结构。FastAPI 会自动将表单数据解析为该模型。
7. 表单数据的编码
FastAPI 默认使用 application/x-www-form-urlencoded
编码来处理表单数据。如果需要处理 multipart/form-data
编码的表单数据(例如文件上传),可以使用 File
和 UploadFile
类。
8. 表单数据的限制
FastAPI 允许对表单数据进行限制,例如最小长度、最大长度、正则表达式等。这些限制可以通过 Pydantic 模型或直接在 Form
中使用参数来实现。
@app.post("/login/") async def login(username: str = Form(..., min_length=3, max_length=50), password: str = Form(..., min_length=8)): return {"username": username}
在这个示例中,username
的长度必须在 3 到 50 之间,password
的长度必须至少为 8。