Request を直接使う¶
🌐 AI と人間による翻訳
この翻訳は、人間のガイドに基づいて AI によって作成されました。🤝
原文の意図を取り違えていたり、不自然な表現になっている可能性があります。🤖
AI LLM をより適切に誘導するのを手伝う ことで、この翻訳を改善できます。
これまで、必要なリクエストの各部分を、その型とともに宣言してきました。
次の場所からデータを取得します:
- パスのパラメータ
- ヘッダー
- クッキー
- など
こうすることで、FastAPI はそのデータを検証し、変換し、API のドキュメントを自動生成します。
しかし、Request オブジェクトに直接アクセスする必要がある場面もあります。
Request オブジェクトの詳細¶
FastAPI は内部的には Starlette の上にいくつかのツール層を載せたものなので、必要に応じて Starlette の Request オブジェクトを直接使えます。
また、Request オブジェクトから直接データ(例: ボディ)を取得する場合、そのデータは FastAPI によって検証・変換・ドキュメント化(OpenAPI による自動 API ユーザーインターフェース向け)されません。
ただし、通常どおりに宣言された他のパラメータ(例: Pydantic モデルのボディ)は引き続き検証・変換・注釈付けなどが行われます。
それでも、Request オブジェクトを取得するのが有用な特定のケースがあります。
Request オブジェクトを直接使う¶
たとえば、path operation 関数内でクライアントの 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}
path operation 関数の引数として Request 型のパラメータを宣言すると、FastAPI はその引数に Request を渡します。
豆知識
この例では、Request 型の引数に加えて、パスパラメータも宣言しています。
そのため、パスパラメータは取り出され、検証され、指定した型に変換され、OpenAPI で注釈(ドキュメント化)されます。
同様に、通常どおり任意の他のパラメータを宣言しつつ、追加で Request も受け取れます。
Request のドキュメント¶
より詳しくは、公式 Starlette ドキュメントサイトの Request オブジェクトを参照してください。
技術詳細
from starlette.requests import Request を使うこともできます。
FastAPI は開発者である皆さんの便宜のために直接提供していますが、これは Starlette からそのまま提供されているものです。