コンテンツにスキップ

高度なミドルウェア

🌐 AI と人間による翻訳

この翻訳は、人間のガイドに基づいて AI によって作成されました。🤝

原文の意図を取り違えていたり、不自然な表現になっている可能性があります。🤖

AI LLM をより適切に誘導するのを手伝う ことで、この翻訳を改善できます。

英語版

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

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

そのためには(CORS の例と同様に)app.add_middleware() を使います。

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 Header 攻撃を防ぐため、すべての受信リクエストに正しく設定された 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 を参照してください。