リクエストの直接使用¶
これまで、必要なリクエストの部分をその型で宣言してきました。
データの取得元
- パスをパラメータとして。
- ヘッダー。
- 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から直接提供されています。