フォームモデル¶
FastAPI では、Pydantic モデルを使用してフォームフィールドを宣言できます。
情報
フォームを使用するには、最初に 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
のドキュメント UI で確認できます。

追加のフォームフィールドを禁止する¶
特別なユースケース(おそらくあまり一般的ではありません)では、フォームフィールドを Pydantic モデルで宣言されたフィールドのみに**制限**し、**追加**のフィールドを**禁止**したい場合があります。
注記
これは FastAPI バージョン `0.114.0` 以降でサポートされています。🤓
Pydantic のモデル設定を使用して、`extra` フィールドを `forbid` することができます。
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"
}
]
}
まとめ¶
FastAPI では、Pydantic モデルを使用してフォームフィールドを宣言できます。😎