コンテンツにスキップ

フォームデータ

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を使用すると、検証、例、エイリアス(例:usernameの代わりにuser-name)など、Body(およびQueryPathCookie)と同じ構成を宣言できます。

情報

Formは、Bodyから直接継承するクラスです。

ヒント

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

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

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

FastAPIは、JSONではなく正しい場所からそのデータを読み取るようにします。

「技術的な詳細」

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

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

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

警告

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

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

要約

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