35 lines
1002 B
Python
35 lines
1002 B
Python
"""
|
|
Simple rate limiter for API requests.
|
|
"""
|
|
|
|
import time
|
|
from collections import defaultdict
|
|
from typing import Dict
|
|
|
|
|
|
class RateLimiter:
|
|
"""Simple rate limiter implementation"""
|
|
|
|
def __init__(self, requests_per_minute: int = 100, burst_size: int = 20):
|
|
self.requests_per_minute = requests_per_minute
|
|
self.burst_size = burst_size
|
|
self.requests: Dict[str, list] = defaultdict(list)
|
|
|
|
def is_allowed(self, client_id: str) -> bool:
|
|
"""Check if request is allowed for client"""
|
|
now = time.time()
|
|
minute_ago = now - 60
|
|
|
|
# Clean old requests
|
|
self.requests[client_id] = [
|
|
req_time for req_time in self.requests[client_id]
|
|
if req_time > minute_ago
|
|
]
|
|
|
|
# Check rate limit
|
|
if len(self.requests[client_id]) >= self.requests_per_minute:
|
|
return False
|
|
|
|
# Add current request
|
|
self.requests[client_id].append(now)
|
|
return True |