コンテンツにスキップ

フォームモデル

🌐 AI と人間による翻訳

この翻訳は、人間のガイドに基づいて AI によって作成されました。🤝

原文の意図を取り違えていたり、不自然な表現になっている可能性があります。🤖

AI LLM をより適切に誘導するのを手伝う ことで、この翻訳を改善できます。

英語版

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
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

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
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

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 モデルを使用できます。😎