コンテンツへスキップ

リクエストの直接使用

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

データの取得元

  • パスをパラメータとして。
  • ヘッダー。
  • 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から直接提供されています。