フォームデータ¶
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
としてエンコードされます。ファイルの処理については、次の章で説明します。
これらのエンコーディングとフォームフィールドの詳細については、MDN WebドキュメントのPOST
を参照してください。
警告
パス操作で複数のForm
パラメータを宣言できますが、JSONとして受信することを期待するBody
フィールドも宣言することはできません。リクエストのボディは、application/json
ではなくapplication/x-www-form-urlencoded
を使用してエンコードされるためです。
これはFastAPIの制限ではなく、HTTPプロトコルの一部です。
要約¶
フォームデータ入力パラメータを宣言するには、Form
を使用します。