フォームモデル¶
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モデルを使ってフォームフィールドを宣言できます。😎