フォームデータ¶
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
を使用すると、Body
(および Query
、Path
、Cookie
) と同じ設定を宣言できます。これには、検証、例、エイリアス (例: username
の代わりに user-name
) などが含まれます。
情報
Form
は Body
を直接継承するクラスです。
ヒント
フォーム本体を宣言するには、明示的に 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
を使用してください。