コンテンツへスキップ

高度なミドルウェア

メインチュートリアルでは、アプリケーションにカスタムミドルウェアを追加する方法を学びました。

そして、CORSMiddlewareを使用したCORSの処理についても学びました。

このセクションでは、他のミドルウェアの使用方法について説明します。

ASGIミドルウェアの追加

FastAPIはStarletteに基づいており、ASGI仕様を実装しているため、任意のASGIミドルウェアを使用できます。

ミドルウェアは、ASGI仕様に従っている限り、FastAPIまたはStarletteのために作成されている必要はありません。

一般的に、ASGIミドルウェアは、最初の引数としてASGIアプリケーションを受け取ると期待されるクラスです。

したがって、サードパーティのASGIミドルウェアのドキュメントでは、おそらく次のような指示があります。

from unicorn import UnicornMiddleware

app = SomeASGIApp()

new_app = UnicornMiddleware(app, some_config="rainbow")

しかし、FastAPI (実際にはStarlette) は、内部ミドルウェアがサーバーエラーを処理し、カスタム例外ハンドラが適切に機能するようにするための、より簡単な方法を提供しています。

そのためには、app.add_middleware()を使用します (CORSの例のように)。

from fastapi import FastAPI
from unicorn import UnicornMiddleware

app = FastAPI()

app.add_middleware(UnicornMiddleware, some_config="rainbow")

app.add_middleware()は、最初の引数としてミドルウェアクラスを、追加の引数としてミドルウェアに渡す引数を受け取ります。

統合されたミドルウェア

FastAPIには、一般的なユースケースのためのいくつかのミドルウェアが含まれています。次にそれらの使用方法を見ていきます。

技術的な詳細

次の例では、from starlette.middleware.something import SomethingMiddlewareも使用できます。

FastAPIは、開発者にとって便利なように、fastapi.middlewareにいくつかのミドルウェアを提供していますが、利用可能なミドルウェアのほとんどはStarletteから直接提供されています。

HTTPSRedirectMiddleware

すべての受信リクエストがhttpsまたはwssであることを強制します。

httpまたはwsへの受信リクエストはすべて、代わりにセキュアなスキームにリダイレクトされます。

from fastapi import FastAPI
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware

app = FastAPI()

app.add_middleware(HTTPSRedirectMiddleware)


@app.get("/")
async def main():
    return {"message": "Hello World"}

TrustedHostMiddleware

HTTPホストヘッダー攻撃を防ぐために、すべての受信リクエストが正しく設定されたHostヘッダーを持っていることを強制します。

from fastapi import FastAPI
from fastapi.middleware.trustedhost import TrustedHostMiddleware

app = FastAPI()

app.add_middleware(
    TrustedHostMiddleware, allowed_hosts=["example.com", "*.example.com"]
)


@app.get("/")
async def main():
    return {"message": "Hello World"}

次の引数がサポートされています。

  • allowed_hosts - ホスト名として許可されるドメイン名のリスト。*.example.comなどのワイルドカードドメインはサブドメインの一致をサポートします。任意のホスト名を許可するには、allowed_hosts=["*"]を使用するか、ミドルウェアを省略します。
  • www_redirect - Trueに設定すると、許可されたホストの非wwwバージョンへのリクエストは、そのwwwバージョンにリダイレクトされます。デフォルトはTrueです。

受信リクエストが正しく検証されない場合、400応答が送信されます。

GZipMiddleware

Accept-Encodingヘッダーに"gzip"が含まれるすべてのリクエストに対してGZip応答を処理します。

ミドルウェアは、標準応答とストリーミング応答の両方を処理します。

from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware

app = FastAPI()

app.add_middleware(GZipMiddleware, minimum_size=1000, compresslevel=5)


@app.get("/")
async def main():
    return "somebigcontent"

次の引数がサポートされています。

  • minimum_size - この最小サイズ (バイト単位) より小さい応答をGZip圧縮しません。デフォルトは500です。
  • compresslevel - GZip圧縮中に使用されます。1から9の整数です。デフォルトは9です。値が低いと圧縮は速くなりますがファイルサイズは大きくなり、値が高いと圧縮は遅くなりますがファイルサイズは小さくなります。

その他のミドルウェア

他にも多くのASGIミドルウェアがあります。

例えば

その他の利用可能なミドルウェアについては、StarletteのミドルウェアドキュメントASGI Awesome Listを参照してください。