コンテンツにスキップ

ミドルウェア

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を処理する方法について説明します。