高度なミドルウェア¶
メインチュートリアルでは、アプリケーションにカスタムミドルウェアを追加する方法について説明しました。
また、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をご覧ください。