跳至內容

表單模型

您可以使用 Pydantic 模型 在 FastAPI 中宣告 表單欄位

資訊

要使用表單,請先安裝 python-multipart

請確保您建立一個 虛擬環境,啟動它,然後安裝它,例如:

$ pip install python-multipart

注意事項

此功能從 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

如果用戶端嘗試傳送一些額外的資料,他們將會收到錯誤回應。

例如,如果用戶端嘗試傳送以下表單欄位:

  • usernameRick
  • passwordPortal Gun
  • extraMr. Poopybutthole

他們將會收到一個錯誤回應,告知他們不允許使用 extra 欄位。

{
    "detail": [
        {
            "type": "extra_forbidden",
            "loc": ["body", "extra"],
            "msg": "Extra inputs are not permitted",
            "input": "Mr. Poopybutthole"
        }
    ]
}

總結

您可以使用 Pydantic 模型在 FastAPI 中宣告表單欄位。😎