フォームデータ¶
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つでは、usernameとpasswordをフォームフィールドとして送信する必要があります。
この仕様では、フィールドの名前がusernameとpasswordで正確に指定され、JSONではなくフォームフィールドとして送信される必要があります。
Formを使用すると、検証、例、エイリアス(例:usernameの代わりにuser-name)など、Body(およびQuery、Path、Cookie)と同じ構成を宣言できます。
情報
FormはBodyから直接継承するクラスです。
ヒント
フォームボディを宣言するには、明示的に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を使用します。