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