limiter.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  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 core.config import get_settings
  8. logger = logging.getLogger(__name__)
  9. settings = get_settings()
  10. # We use the same redis instance which is used to store build metadata
  11. # and other cached data. To keep that data separate, we use db-1 of the
  12. # redis instance instead of the default db-0.
  13. REDIS_DB_NUMBER = 1
  14. limiter = Limiter(
  15. key_func=get_remote_address,
  16. storage_uri=f"redis://{settings.redis_host}:{settings.redis_port}/{REDIS_DB_NUMBER}",
  17. strategy="fixed-window",
  18. )
  19. def rate_limit_exceeded_handler(request: Request, exc: RateLimitExceeded) -> JSONResponse:
  20. """
  21. Response to send when a rate limit is exception is raised
  22. """
  23. response = JSONResponse(
  24. {"detail": "Too many requests. Try again after some time."},
  25. status_code=429
  26. )
  27. response = request.app.state.limiter._inject_headers(
  28. response, request.state.view_rate_limit
  29. )
  30. return response