コンテンツへスキップ

ミドルウェア

FastAPI アプリケーションにミドルウェアを追加できます。

「ミドルウェア」は、特定のパス操作によって処理される前にすべてのリクエストを処理し、返される前にすべてのレスポンスを処理する関数です。

  • アプリケーションに届くすべてのリクエストを受け取ります。
  • その後、そのリクエストに対して何かを実行したり、必要なコードを実行したりできます。
  • 次に、リクエストをアプリケーションの残りの部分(一部のパス操作)で処理するために渡します。
  • その後、アプリケーションによって生成されたレスポンス(一部のパス操作)を受け取ります。
  • そのレスポンスに対して何かを実行したり、必要なコードを実行したりできます。
  • 次に、レスポンスを返します。

技術的な詳細

yield を持つ依存関係がある場合、終了コードはミドルウェアの*後に*実行されます。

バックグラウンドタスク(バックグラウンドタスクセクションで後で説明します)がある場合、それらはすべてのミドルウェアの*後に*実行されます。

ミドルウェアを作成する

ミドルウェアを作成するには、関数の上にデコレータ @app.middleware("http") を使用します。

ミドルウェア関数は以下を受け取ります。

  • リクエスト
  • リクエスト をパラメータとして受け取る関数 call_next
    • この関数は リクエスト を対応するパス操作に渡します。
    • 次に、対応するパス操作によって生成された レスポンス を返します。
  • その後、返却する前に レスポンス をさらに変更できます。
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から直接来ています。

レスポンス の前後

リクエストパス操作によって受け取られる前に、その リクエスト で実行されるコードを追加できます。

また、レスポンス が生成された後、返される前にも追加できます。

例えば、リクエストの処理とレスポンスの生成にかかった時間を秒単位で含むカスタムヘッダー 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 → ルート

  • レスポンス: ルート → MiddlewareA → MiddlewareB

このスタック動作により、ミドルウェアが予測可能で制御可能な順序で実行されることが保証されます。

その他のミドルウェア

高度なユーザーガイド: 高度なミドルウェアで、他のミドルウェアについてさらに詳しく読むことができます。

次のセクションでは、ミドルウェアで CORS を処理する方法について説明します。