ミドルウェア¶
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 (オリジン間リソース共有))
技術詳細
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
その他のミドルウェア¶
他のミドルウェアの詳細については、高度なユーザーガイド: 高度なミドルウェアを参照してください。
次のセクションでは、ミドルウェアを使用して CORS を処理する方法について説明します。