Admin-Desk / app /utils /rate_limiter.py
Fred808's picture
Upload 54 files
a3b84cc verified
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
))