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