コンテンツにスキップ

高度なミドルウェア

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

また、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)は、内部ミドルウェアがサーバーエラーを処理し、カスタム例外ハンドラが正しく機能することを保証する、より簡単な方法を提供しています。

from fastapi import FastAPI
from unicorn import UnicornMiddleware

app = FastAPI()

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

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

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

統合ミドルウェア

FastAPIには、一般的なユースケース向けのミドルウェアがいくつか含まれています。次に、それらの使用方法について説明します。

"技術的な詳細"

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

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

HTTPSRedirectMiddleware

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

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"}

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

TrustedHostMiddleware

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"}

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

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

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"

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

  • ミドルウェアは、標準レスポンスとストリーミングレスポンスの両方を処理します。
  • minimum_size - この最小サイズ(バイト単位)より小さいレスポンスはGZip圧縮しません。デフォルトは500です。

compresslevel - GZip圧縮中に使用されます。1から9までの整数です。デフォルトは9です。値が小さいほど圧縮は高速になりますが、ファイルサイズが大きくなります。値が大きいほど圧縮は遅くなりますが、ファイルサイズが小さくなります。

その他のミドルウェア

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

利用可能な他のミドルウェアを確認するには、StarletteのミドルウェアドキュメントASGI Awesome Listをご覧ください。