fastapi/docs/ja/docs/advanced/path-operation-advanced-con...

8.3 KiB
Raw Blame History

Path Operationの高度な設定

OpenAPI operationId

/// warning | 注意

OpenAPIの「エキスパート」でなければ、これはおそらく必要ありません。

///

path operationoperation_id パラメータを利用することで、OpenAPIの operationId を設定できます。

各オペレーションで一意になるようにする必要があります。

{* ../../docs_src/path_operation_advanced_configuration/tutorial001_py310.py hl[6] *}

path operation関数 の名前をoperationIdとして使用する

APIの関数名を operationId として利用したい場合、すべてのAPI関数をイテレーションし、各 path operationoperation_idAPIRoute.name で上書きすれば可能です。

すべての path operation を追加した後に行うべきです。

{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}

/// tip | 豆知識

app.openapi() を手動で呼び出す場合、その前に operationId を更新するべきです。

///

/// warning | 注意

この方法をとる場合、各 path operation関数 が一意な名前である必要があります。

異なるモジュールPythonファイルにある場合でも同様です。

///

OpenAPIから除外する

生成されるOpenAPIスキーマつまり、自動ドキュメント生成の仕組みから path operation を除外するには、include_in_schema パラメータを使用して False に設定します。

{* ../../docs_src/path_operation_advanced_configuration/tutorial003_py310.py hl[6] *}

docstringによる説明の高度な設定

path operation関数 のdocstringからOpenAPIに使用する行を制限できます。

\fエスケープされた「書式送りform feed」文字を追加すると、FastAPI はその地点でOpenAPIに使用される出力を切り詰めます。

ドキュメントには表示されませんが、他のツールSphinxなどは残りの部分を利用できます。

{* ../../docs_src/path_operation_advanced_configuration/tutorial004_py310.py hl[17:27] *}

追加レスポンス

path operation に対して response_modelstatus_code を宣言する方法はすでに見たことがあるでしょう。

それにより、path operation のメインのレスポンスに関するメタデータが定義されます。

追加のレスポンスについても、モデルやステータスコードなどとともに宣言できます。

これについてはドキュメントに章全体があります。 OpenAPIの追加レスポンス{.internal-link target=_blank} で読めます。

OpenAPI Extra

アプリケーションで path operation を宣言すると、FastAPI はOpenAPIスキーマに含めるために、その path operation に関連するメタデータを自動的に生成します。

/// note | 技術詳細

OpenAPI仕様では Operation Object と呼ばれています。

///

これには path operation に関するすべての情報が含まれ、自動ドキュメントを生成するために使われます。

tagsparametersrequestBodyresponses などが含まれます。

この path operation 固有のOpenAPIスキーマは通常 FastAPI により自動生成されますが、拡張することもできます。

/// tip | 豆知識

これは低レベルな拡張ポイントです。

追加レスポンスを宣言するだけなら、より便利な方法として OpenAPIの追加レスポンス{.internal-link target=_blank} を使うことができます。

///

openapi_extra パラメータを使って、path operation のOpenAPIスキーマを拡張できます。

OpenAPI Extensions

この openapi_extra は、例えば OpenAPI Extensions を宣言するのに役立ちます。

{* ../../docs_src/path_operation_advanced_configuration/tutorial005_py310.py hl[6] *}

自動APIドキュメントを開くと、その拡張は特定の path operation の下部に表示されます。

そしてAPIの /openapi.json にある生成されたOpenAPIを見ると、その拡張も特定の path operation の一部として確認できます。

{
    "openapi": "3.1.0",
    "info": {
        "title": "FastAPI",
        "version": "0.1.0"
    },
    "paths": {
        "/items/": {
            "get": {
                "summary": "Read Items",
                "operationId": "read_items_items__get",
                "responses": {
                    "200": {
                        "description": "Successful Response",
                        "content": {
                            "application/json": {
                                "schema": {}
                            }
                        }
                    }
                },
                "x-aperture-labs-portal": "blue"
            }
        }
    }
}

カスタムOpenAPI path operation スキーマ

openapi_extra 内の辞書は、path operation 用に自動生成されたOpenAPIスキーマと深くマージされます。

そのため、自動生成されたスキーマに追加データを加えることができます。

例えば、Pydanticを使ったFastAPIの自動機能を使わずに独自のコードでリクエストを読み取り・検証することを選べますが、それでもOpenAPIスキーマでリクエストを定義したい場合があります。

それは openapi_extra で行えます。

{* ../../docs_src/path_operation_advanced_configuration/tutorial006_py310.py hl[19:36, 39:40] *}

この例では、Pydanticモデルを一切宣言していません。実際、リクエストボディはJSONとして パース されず、直接 bytes として読み取られます。そして magic_data_reader() 関数が、何らかの方法でそれをパースする責務を担います。

それでも、リクエストボディに期待されるスキーマを宣言できます。

カスタムOpenAPI content type

同じトリックを使って、PydanticモデルでJSON Schemaを定義し、それを path operation 用のカスタムOpenAPIスキーマセクションに含めることができます。

また、リクエスト内のデータ型がJSONでない場合でもこれを行えます。

例えばこのアプリケーションでは、PydanticモデルからJSON Schemaを抽出するFastAPIの統合機能や、JSONの自動バリデーションを使っていません。実際、リクエストのcontent typeをJSONではなくYAMLとして宣言しています。

{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py310.py hl[15:20, 22] *}

それでも、デフォルトの統合機能を使っていないにもかかわらず、YAMLで受け取りたいデータのために、Pydanticモデルを使って手動でJSON Schemaを生成しています。

そしてリクエストを直接使い、ボディを bytes として抽出します。これは、FastAPIがリクエストペイロードをJSONとしてパースしようとすらしないことを意味します。

その後、コード内でそのYAMLコンテンツを直接パースし、さらに同じPydanticモデルを使ってYAMLコンテンツを検証しています。

{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py310.py hl[24:31] *}

/// tip | 豆知識

ここでは同じPydanticモデルを再利用しています。

ただし同様に、別の方法で検証することもできます。

///