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