FastAPI - 访问表单数据
现在我们将看到如何在 FastAPI 操作函数中访问 HTML 表单数据。在 FastAPI - HTML 表单模板章节 中更新的示例中,/login 路由会渲染一个登录表单。用户输入的数据将以 POST 请求方法提交到 /submit URL。现在我们需要提供一个视图函数来处理用户提交的数据。
FastAPI 提供了一个 Form class 来处理通过提交 HTML 表单接收到的请求数据。但是,你需要安装 python-multipart 模块。它是一个用于 Python 的流式 multipart 表单解析器。
pip3 install python-multipart Collecting python-multipart Downloading python_multipart-0.0.21-py3-none-any.whl.metadata (1.8 kB) Downloading python_multipart-0.0.21-py3-none-any.whl (24 kB) Installing collected packages: python-multipart Successfully installed python-multipart-0.0.21
将 Form class 添加到从 FastAPI 导入的资源中
from fastapi import Form
让我们定义一个被 @app.post() 装饰的 submit() 函数。为了接收表单数据,声明两个 Form 类型的参数,其名称与表单属性相同。
@app.post("/submit/")
async def submit(nm: str = Form(...), pwd: str = Form(...)):
return {"username": nm}
填写文本字段后按提交按钮。浏览器将被重定向到 /submit URL,并渲染 JSON 响应。检查 /submit 路由的 Swagger API 文档。它正确地将 nm 和 pwd 识别为请求体参数,并将表单的“media type”识别为 application/x-www-form-urlencoded。
甚至可以将 HTML 表单数据填充并返回 Pydantic model。在以下代码中,我们将 User class 声明为 Pydantic model,并将其对象作为服务器响应发送。
main.py
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from fastapi import Form
from pydantic import BaseModel
app = FastAPI()
templates = Jinja2Templates(directory="templates")
app.mount("/static", StaticFiles(directory="static"), name="static")
@app.get("/hello/{name}", response_class=HTMLResponse)
async def hello(request: Request, name:str):
return templates.TemplateResponse("hello.html", {"request": request, "name":name})
@app.get("/login/", response_class=HTMLResponse)
async def login(request: Request):
return templates.TemplateResponse("login.html", {"request": request})
class User(BaseModel):
username:str
password:str
@app.post("/submit/", response_model=User)
async def submit(nm: str = Form(...), pwd: str = Form(...)):
return User(username=nm, password=pwd)