コンテンツへスキップ

フォームモデル

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