ミドルウェア¶
🌐 Translation by AI and humans
This translation was made by AI guided by humans. 🤝
It could have mistakes of misunderstanding the original meaning, or looking unnatural, etc. 🤖
You can improve this translation by helping us guide the AI LLM better.
FastAPI アプリケーションにミドルウェアを追加できます。
「ミドルウェア」は、すべてのリクエストに対して、それがあらゆる特定のpath operationによって処理される前に機能する関数です。また、すべてのレスポンスに対して、それを返す前に機能します。
- ミドルウェアはアプリケーションに届いたそれぞれのリクエストを受け取ります。
- その後、そのリクエストに対して何かを実行したり、必要なコードを実行したりできます。
- 次に、アプリケーションの残りの部分にリクエストを渡して (path operation によって) 処理させます。
- 次に、ミドルウェアはアプリケーション (の path operation) によって生成されたレスポンスを受け取ります。
- そのレスポンスに対して何かを実行したり、必要なコードを実行したりできます。
- そして、レスポンスを返します。
技術詳細
yield を使った依存関係をもつ場合は、終了コードはミドルウェアの 後に 実行されます。
バックグラウンドタスク (バックグラウンドタスク セクションで説明します。後で確認できます) がある場合は、それらは全てのミドルウェアの 後に 実行されます。
ミドルウェアの作成¶
ミドルウェアを作成するには、関数の上部でデコレータ @app.middleware("http") を使用します。
ミドルウェア関数は以下を受け取ります:
request。- パラメータとして
requestを受け取る関数call_next。- この関数は、対応するpath operationに
requestを渡します。 - 次に、対応するpath operationによって生成された
responseを返します。
- この関数は、対応するpath operationに
- その後、
responseを返す前にさらにresponseを変更することもできます。
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.perf_counter()
response = await call_next(request)
process_time = time.perf_counter() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
豆知識
カスタムの独自ヘッダーは X- プレフィックスを使用して追加できる点に注意してください。
ただし、ブラウザのクライアントに表示させたいカスタムヘッダーがある場合は、StarletteのCORSドキュメントに記載されているパラメータ expose_headers を使用して、それらをCORS設定に追加する必要があります (CORS (Cross-Origin Resource Sharing))。
技術詳細
from starlette.requests import Request を使用することもできます。
FastAPIは、開発者の便利のためにこれを提供していますが、Starletteから直接きています。
response の前後¶
path operation が request を受け取る前に、 request とともに実行されるコードを追加できます。
また response が生成された後、それを返す前にも追加できます。
例えば、リクエストの処理とレスポンスの生成にかかった秒数を含むカスタムヘッダー X-Process-Time を追加できます:
import time
from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.perf_counter()
response = await call_next(request)
process_time = time.perf_counter() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response
豆知識
ここでは、これらのユースケースに対してより正確になり得るため、time.time() の代わりに time.perf_counter() を使用しています。 🤓
複数ミドルウェアの実行順序¶
@app.middleware() デコレータまたは app.add_middleware() メソッドのいずれかを使って複数のミドルウェアを追加すると、新しく追加された各ミドルウェアがアプリケーションをラップし、スタックを形成します。最後に追加されたミドルウェアが 最も外側、最初に追加されたミドルウェアが 最も内側 になります。
リクエスト経路では、最も外側 のミドルウェアが最初に実行されます。
レスポンス経路では、最後に実行されます。
例:
app.add_middleware(MiddlewareA)
app.add_middleware(MiddlewareB)
これにより、実行順序は次のようになります:
-
リクエスト: MiddlewareB → MiddlewareA → route
-
レスポンス: route → MiddlewareA → MiddlewareB
このスタック動作により、ミドルウェアが予測可能で制御しやすい順序で実行されることが保証されます。
その他のミドルウェア¶
他のミドルウェアの詳細については、高度なユーザーガイド: 高度なミドルウェアを参照してください。
次のセクションでは、ミドルウェアを使用して CORS を処理する方法について説明します。