ミドルウェア¶
FastAPIアプリケーションにミドルウェアを追加できます。
「ミドルウェア」とは、特定のパス操作で処理される前のすべてのリクエストと、返される前のすべてのレスポンスを扱う関数です。
- アプリケーションに届くすべてのリクエストを受け取ります。
- 次に、そのリクエストに対して何かを実行したり、必要なコードを実行したりできます。
- 次に、アプリケーションの残りの部分(一部のパス操作)で処理されるようにリクエストを渡します。
- 次に、アプリケーション(一部のパス操作)によって生成されたレスポンスを受け取ります。
- そのレスポンスに対して何かを実行したり、必要なコードを実行したりできます。
- 次に、レスポンスを返します。
「技術的な詳細」
yield
付きの依存関係がある場合、終了コードはミドルウェアの後に実行されます。
(後でドキュメント化する)バックグラウンドタスクがある場合、それらはすべてのミドルウェアの後に実行されます。
ミドルウェアの作成¶
ミドルウェアを作成するには、関数の上に@app.middleware("http")
デコレーターを使用します。
ミドルウェア関数は以下を受け取ります
request
。request
をパラメータとして受け取る関数call_next
。- この関数は、対応するパス操作に
request
を渡します。 - 次に、対応するパス操作によって生成された
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-」プレフィックスを使用して追加できることに注意してください。
ただし、ブラウザのクライアントからカスタムヘッダーを表示できるようにしたい場合は、CORS設定(CORS (クロスオリジンリソース共有))にそれらを追加する必要があります。 StarletteのCORSドキュメントで説明されているパラメータexpose_headers
を使用してください。
「技術的な詳細」
from starlette.requests import Request
も使用できます。
FastAPIは開発者の便宜のためにそれを提供しています。しかし、それはStarletteから直接来ています。
response
の前と後¶
任意のパス操作がそれを受け取る前に、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()
を使用しています。🤓
その他のミドルウェア¶
その他のミドルウェアの詳細については、後で高度なユーザーガイド: 高度なミドルウェアで読むことができます。
次のセクションでは、ミドルウェアを使用してCORSを処理する方法について説明します。