コンテンツへスキップ

フォームデータ

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パラメータを定義

BodyQueryと同じ方法でフォームパラメータを作成します

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)と同じ構成を宣言できます。

情報

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

ヒント

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

"フォームフィールド"について

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

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

技術的な詳細

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

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

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

Warning

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

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

まとめ

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