You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.3 KiB

フォームデータ

JSONの代わりにフィールドを受け取る場合は、Formを使用します。

!!! info "情報" フォームを使うためには、まずpython-multipartをインストールします。

たとえば、`pip install python-multipart`のように。

Formのインポート

fastapiからFormをインポートします:

{!../../../docs_src/request_forms/tutorial001.py!}

Formのパラメータの定義

BodyQueryの場合と同じようにフォームパラメータを作成します:

{!../../../docs_src/request_forms/tutorial001.py!}

例えば、OAuth2仕様が使用できる方法の1つ(「パスワードフロー」と呼ばれる)では、フォームフィールドとしてusernamepasswordを送信する必要があります。

仕様では、フィールドの名前がusernamepasswordであることと、JSONではなくフォームフィールドとして送信されることを要求しています。

FormではBody(およびQueryPathCookie)と同じメタデータとバリデーションを宣言することができます。

!!! info "情報" FormBodyを直接継承するクラスです。

!!! tip "豆知識" フォームのボディを宣言するには、明示的にFormを使用する必要があります。なぜなら、これを使わないと、パラメータはクエリパラメータやボディ(JSON)パラメータとして解釈されるからです。

「フォームフィールド」について

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

FastAPI は、JSONの代わりにそのデータを適切な場所から読み込むようにします。

!!! note "技術詳細" フォームからのデータは通常、application/x-www-form-urlencodedの「media type」を使用してエンコードされます。

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

これらのエンコーディングやフォームフィールドの詳細については、<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" class="external-link" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr>の<code>POST</code></a>のウェブドキュメントを参照してください。

!!! warning "注意" path operationで複数のFormパラメータを宣言することができますが、JSONとして受け取ることを期待しているBodyフィールドを宣言することはできません。なぜなら、リクエストはapplication/jsonの代わりにapplication/x-www-form-urlencodedを使ってボディをエンコードするからです。

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

まとめ

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