おうちDCは、リソースが限られています。何も設定しないと、ひたすらユーザーをまたせた挙句に、504 Gateway Timeout を発生させてしまいます。
ならば、予めアクセスの上限を設けて、429 Too Many Requests を素早く返してあげる方が良いかと思いますので、その設定についてまとめます。
slowapi のインストール
main.py の設定
私は fastAPI を使うときは、main.py という名前でファイルを作っていますが、別のファイル名の場合は、そちらを編集してください。
ライブラリの読み込み
from slowapi import Limiter
from slowapi.errors import RateLimitExceeded
from slowapi.util import get_remote_address
from slowapi.middleware import SlowAPIMiddleware
from starlette.responses import JSONResponse
Limiterの設定
app = FastAPI()
より下に書いてください
limiter = Limiter(key_func=get_remote_address)
app.state.limiter = limiter
app.add_middleware(SlowAPIMiddleware)
RateLimitExceeded 例外ハンドラの追加
@app.exception_handler(RateLimitExceeded)
async def rate_limit_exceeded_handler(request: Request, exc: RateLimitExceeded):
return JSONResponse(
status_code=429,
content={"detail": "Too many requests"},
)
ルーター設定
@app.get("/")
@limiter.limit("6/minute")
async def root(request: Request):
pass
上記は、1分間に6回以上アクセスが来た場合に 429 エラーを発生させます。