Spaces:
Sleeping
Sleeping
| from fastapi import Request, HTTPException | |
| import time | |
| from collections import defaultdict | |
| from typing import Dict, List | |
| class RateLimiter: | |
| """ | |
| A simple in-memory Rate Limiter for endpoints. | |
| In a high-scale production environment with multiple server instances, | |
| this would be backed by Redis instead of memory. | |
| """ | |
| def __init__(self, requests: int, window: int): | |
| self.rate_limit = requests | |
| self.window = window | |
| self.requests_record: Dict[str, List[float]] = defaultdict(list) | |
| def __call__(self, request: Request): | |
| client_ip = request.client.host if request.client else "unknown" | |
| now = time.time() | |
| # Clean up old timestamps outside the window | |
| self.requests_record[client_ip] = [ | |
| timestamp for timestamp in self.requests_record[client_ip] | |
| if now - timestamp < self.window | |
| ] | |
| # Check if they have exceeded the limit | |
| if len(self.requests_record[client_ip]) >= self.rate_limit: | |
| raise HTTPException( | |
| status_code=429, | |
| detail="Too Many Requests. Please wait before trying again." | |
| ) | |
| # Record this request | |
| self.requests_record[client_ip].append(now) | |
| # Create instances for specific endpoints (5 requests per 60 seconds) | |
| upload_rate_limiter = RateLimiter(requests=5, window=60) | |
| process_rate_limiter = RateLimiter(requests=5, window=60) | |