| from slowapi import Limiter | |
| from slowapi.util import get_remote_address | |
| from fastapi import Request | |
| from app.config import settings | |
| def get_real_client_ip(request: Request) -> str: | |
| """Extract real client IP address behind reverse proxies (Cloudflare, Railway, Vercel, ALB).""" | |
| cf_ip = request.headers.get("CF-Connecting-IP") | |
| if cf_ip: | |
| return cf_ip.strip() | |
| forwarded = request.headers.get("X-Forwarded-For") | |
| if forwarded: | |
| return forwarded.split(",")[0].strip() | |
| real_ip = request.headers.get("X-Real-IP") | |
| if real_ip: | |
| return real_ip.strip() | |
| return get_remote_address(request) | |
| limiter = Limiter(key_func=get_real_client_ip, default_limits=[settings.RATE_LIMIT]) | |