| 1234567891011121314151617181920212223242526272829303132333435 |
- import logging
- from fastapi import Request
- from fastapi.responses import JSONResponse
- from slowapi.errors import RateLimitExceeded
- from slowapi import Limiter
- from slowapi.util import get_remote_address
- from core.config import get_settings
- logger = logging.getLogger(__name__)
- settings = get_settings()
- # We use the same redis instance which is used to store build metadata
- # and other cached data. To keep that data separate, we use db-1 of the
- # redis instance instead of the default db-0.
- REDIS_DB_NUMBER = 1
- limiter = Limiter(
- key_func=get_remote_address,
- storage_uri=f"redis://{settings.redis_host}:{settings.redis_port}/{REDIS_DB_NUMBER}",
- strategy="fixed-window",
- )
- def rate_limit_exceeded_handler(request: Request, exc: RateLimitExceeded) -> JSONResponse:
- """
- Response to send when a rate limit is exception is raised
- """
- response = JSONResponse(
- {"detail": "Too many requests. Try again after some time."},
- status_code=429
- )
- response = request.app.state.limiter._inject_headers(
- response, request.state.view_rate_limit
- )
- return response
|