Spaces:
Paused
Paused
| from fastapi import HTTPException, Request | |
| from redis import Redis | |
| from ..core.config import settings | |
| import time | |
| class RateLimiter: | |
| def __init__(self, redis_client: Redis): | |
| self.redis = redis_client | |
| self.rate_limit = 100 # requests | |
| self.time_window = 60 # seconds | |
| async def check_rate_limit(self, request: Request): | |
| client_ip = request.client.host | |
| key = f"rate_limit:{client_ip}" | |
| current = int(time.time()) | |
| window_start = current - self.time_window | |
| pipeline = self.redis.pipeline() | |
| pipeline.zremrangebyscore(key, 0, window_start) | |
| pipeline.zadd(key, {str(current): current}) | |
| pipeline.zcard(key) | |
| pipeline.expire(key, self.time_window) | |
| _, _, request_count, _ = pipeline.execute() | |
| if request_count > self.rate_limit: | |
| raise HTTPException( | |
| status_code=429, | |
| detail="Too many requests. Please try again later." | |
| ) | |
| rate_limiter = RateLimiter(Redis( | |
| host=settings.REDIS_HOST, | |
| port=settings.REDIS_PORT, | |
| decode_responses=True | |
| )) |