Files
2025-12-13 14:39:50 +03:00

36 lines
1.3 KiB
Python

from fastapi import Request, HTTPException, status
from starlette.middleware.base import BaseHTTPMiddleware
from app.core.config import settings
from app.services.cache_service import cache_service
import time
class RateLimitMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next):
if not settings.RATE_LIMIT_ENABLED:
return await call_next(request)
# Получаем IP адрес клиента
client_ip = request.client.host if request.client else "unknown"
# Формируем ключ для кэша
cache_key = f"rate_limit:{client_ip}"
# Проверяем количество запросов
current_requests = await cache_service.get(cache_key)
if current_requests:
count = int(current_requests)
if count >= settings.RATE_LIMIT_PER_MINUTE:
raise HTTPException(
status_code=status.HTTP_429_TOO_MANY_REQUESTS,
detail="Rate limit exceeded"
)
await cache_service.set(cache_key, str(count + 1), expire=60)
else:
await cache_service.set(cache_key, "1", expire=60)
response = await call_next(request)
return response