コンテンツへスキップ

フォームデータ

JSON の代わりにフォームフィールドを受け取る必要がある場合は、Form を使用できます。

情報

フォームを使用するには、まず python-multipart をインストールしてください。

仮想環境を作成し、アクティブ化してからインストールしてください。たとえば、

$ pip install python-multipart

Form のインポート

fastapi から Form をインポートします。

from typing import Annotated

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
    return {"username": username}
🤓 その他のバージョンとバリアント
from fastapi import FastAPI, Form
from typing_extensions import Annotated

app = FastAPI()


@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
    return {"username": username}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
    return {"username": username}

Form パラメータの定義

Body または Query と同じ方法でフォームパラメータを作成します。

from typing import Annotated

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
    return {"username": username}
🤓 その他のバージョンとバリアント
from fastapi import FastAPI, Form
from typing_extensions import Annotated

app = FastAPI()


@app.post("/login/")
async def login(username: Annotated[str, Form()], password: Annotated[str, Form()]):
    return {"username": username}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from fastapi import FastAPI, Form

app = FastAPI()


@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
    return {"username": username}

たとえば、OAuth2 仕様の利用方法の 1 つ (「パスワードフロー」と呼ばれます) では、usernamepassword をフォームフィールドとして送信する必要があります。

仕様では、フィールド名が正確にusernamepasswordであり、JSONではなくフォームフィールドとして送信されることが求められています。

Form を使用すると、Body (および QueryPathCookie) と同じ設定を宣言できます。これには、検証、例、エイリアス (例: username の代わりに user-name) などが含まれます。

情報

FormBody を直接継承するクラスです。

ヒント

フォーム本体を宣言するには、明示的に Form を使用する必要があります。これがないと、パラメータはクエリパラメータまたは本体 (JSON) パラメータとして解釈されます。

「フォームフィールド」について

HTML フォーム (<form></form>) がデータをサーバーに送信する方法は、通常、そのデータに「特殊な」エンコーディングを使用します。これは JSON とは異なります。

FastAPI は、JSON の代わりに適切な場所からデータを確実に読み取ります。

技術的な詳細

フォームからのデータは通常、メディアタイプ application/x-www-form-urlencoded を使用してエンコードされます。

しかし、フォームにファイルが含まれる場合、multipart/form-data としてエンコードされます。ファイルの処理については次の章で説明します。

これらのエンコーディングとフォームフィールドについてさらに詳しく知りたい場合は、POSTに関するMDN Web ドキュメントを参照してください。

警告

1 つの *パス操作* で複数の Form パラメータを宣言することはできますが、JSON として受信することを期待する Body フィールドを宣言することはできません。リクエストの本体は application/json の代わりに application/x-www-form-urlencoded を使用してエンコードされるためです。

これはFastAPIの制限ではなく、HTTPプロトコルの一部です。

まとめ

フォームデータ入力パラメータを宣言するには、Form を使用してください。