limiter.py 875 B

12345678910111213141516171819202122232425262728293031
  1. import logging
  2. from fastapi import Request
  3. from fastapi.responses import JSONResponse
  4. from slowapi.errors import RateLimitExceeded
  5. from slowapi import Limiter
  6. from slowapi.util import get_remote_address
  7. from web.core.config import get_settings
  8. logger = logging.getLogger(__name__)
  9. settings = get_settings()
  10. limiter = Limiter(
  11. key_func=get_remote_address,
  12. storage_uri=settings.rate_limiter_storage_uri,
  13. strategy="fixed-window",
  14. )
  15. def rate_limit_exceeded_handler(request: Request, exc: RateLimitExceeded) -> JSONResponse:
  16. """
  17. Response to send when a rate limit is exception is raised
  18. """
  19. response = JSONResponse(
  20. {"detail": "Too many requests. Try again after some time."},
  21. status_code=429
  22. )
  23. response = request.app.state.limiter._inject_headers(
  24. response, request.state.view_rate_limit
  25. )
  26. return response