表單模型¶
您可以使用 Pydantic 模型 在 FastAPI 中宣告 表單欄位。
注意事項
此功能從 FastAPI 版本 0.113.0
開始支援。🤓
用於表單的 Pydantic 模型¶
您只需要使用您想要接收為 表單欄位 的欄位宣告一個 Pydantic 模型,然後將參數宣告為 Form
from typing import Annotated
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
from fastapi import FastAPI, Form
from pydantic import BaseModel
from typing_extensions import Annotated
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
小技巧
如果可能,建議使用 Annotated
版本。
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
@app.post("/login/")
async def login(data: FormData = Form()):
return data
FastAPI 將會從請求中的 表單資料 中 提取 每個欄位 的資料,並提供您定義的 Pydantic 模型。
查看文件¶
您可以在 /docs
的文件介面中驗證它。

禁止額外的表單欄位¶
在某些特殊情況下(可能不太常見),您可能希望將表單欄位限制為僅在 Pydantic 模型中宣告的欄位,並禁止任何額外的欄位。
注意事項
此功能從 FastAPI 版本 0.114.0
開始支援。🤓
您可以使用 Pydantic 的模型設定來 禁止
任何 額外
的欄位。
from typing import Annotated
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
from fastapi import FastAPI, Form
from pydantic import BaseModel
from typing_extensions import Annotated
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: Annotated[FormData, Form()]):
return data
小技巧
如果可能,建議使用 Annotated
版本。
from fastapi import FastAPI, Form
from pydantic import BaseModel
app = FastAPI()
class FormData(BaseModel):
username: str
password: str
model_config = {"extra": "forbid"}
@app.post("/login/")
async def login(data: FormData = Form()):
return data
如果用戶端嘗試傳送一些額外的資料,他們將會收到錯誤回應。
例如,如果用戶端嘗試傳送以下表單欄位:
username
:Rick
password
:Portal Gun
extra
:Mr. Poopybutthole
他們將會收到一個錯誤回應,告知他們不允許使用 extra
欄位。
{
"detail": [
{
"type": "extra_forbidden",
"loc": ["body", "extra"],
"msg": "Extra inputs are not permitted",
"input": "Mr. Poopybutthole"
}
]
}
總結¶
您可以使用 Pydantic 模型在 FastAPI 中宣告表單欄位。😎