フォームデータ¶
🌐 Translation by AI and humans
This translation was made by AI guided by humans. 🤝
It could have mistakes of misunderstanding the original meaning, or looking unnatural, etc. 🤖
You can improve this translation by helping us guide the AI LLM better.
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}
🤓 Other versions and variants
Tip
Prefer to use the Annotated version if possible.
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}
🤓 Other versions and variants
Tip
Prefer to use the Annotated version if possible.
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を送信する必要があります。
specでは、フィールドの名前が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の「media type」を使用してエンコードされます。
しかし、フォームがファイルを含む場合は、multipart/form-dataとしてエンコードされます。ファイルの扱いについては次の章で説明します。
これらのエンコーディングやフォームフィールドの詳細については、MDNのPOSTのウェブドキュメントを参照してください。
注意
path operationで複数のFormパラメータを宣言することができますが、JSONとして受け取ることを期待しているBodyフィールドを宣言することはできません。なぜなら、リクエストはapplication/jsonの代わりにapplication/x-www-form-urlencodedを使ってボディをエンコードするからです。
これは FastAPIの制限ではなく、HTTPプロトコルの一部です。
まとめ¶
フォームデータの入力パラメータを宣言するには、Formを使用する。