コンテンツへスキップ

リクエストを直接使用する

これまで、必要なリクエストの各部分をその型とともに宣言してきました。

次のデータを受け取る

  • パスをパラメータとして。
  • ヘッダー。
  • Cookie。
  • など

そしてそうすることで、FastAPI はそのデータを検証し、変換し、API のドキュメントを自動的に生成しています。

しかし、Request オブジェクトに直接アクセスする必要がある状況もあります。

Request オブジェクトの詳細

FastAPI は実際にはStarlette の上にいくつかのツールが層になったものであるため、必要に応じて Starlette の Request オブジェクトを直接使用できます。

また、Request オブジェクトから直接データ (たとえば、ボディ) を取得した場合、FastAPI によって検証、変換、またはドキュメント化 (OpenAPI での自動 API ユーザーインターフェース用) されないことを意味します。

ただし、通常に宣言された他のパラメータ (たとえば、Pydantic モデルを持つボディ) は、引き続き検証、変換、注釈付けなどが行われます。

しかし、Request オブジェクトを取得すると便利な特定のケースがあります。

Request オブジェクトを直接使用する

パス操作関数内でクライアントの IP アドレス/ホストを取得したいと仮定してみましょう。

そのためには、リクエストに直接アクセスする必要があります。

from fastapi import FastAPI, Request

app = FastAPI()


@app.get("/items/{item_id}")
def read_root(item_id: str, request: Request):
    client_host = request.client.host
    return {"client_host": client_host, "item_id": item_id}

パス操作関数パラメータを Request 型で宣言することで、FastAPI はそのパラメータに Request を渡すことを認識します。

ヒント

この場合、リクエストパラメータの横にパスパラメータを宣言していることに注意してください。

したがって、パスパラメータは抽出され、検証され、指定された型に変換され、OpenAPI で注釈が付けられます。

同じように、他のパラメータも通常どおり宣言でき、さらに Request も取得できます。

Request ドキュメント

公式 Starlette ドキュメントサイトRequest オブジェクトに関する詳細を読むことができます。

技術的な詳細

また、from starlette.requests import Request を使用することもできます。

FastAPI は開発者の便宜のために直接提供していますが、それは Starlette から直接来ています。