コンテンツへスキップ

高度なミドルウェア

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

そして、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=["*"]を使用するか、ミドルウェアを省略します。

受信リクエストが正しく検証されない場合、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を確認してください。