Skip to Content
DocumentationBackendFastAPI (Python)

FastAPI (Python)

FastAPI está construido para aplicaciones web asíncronas de alto rendimiento. Para mantener esa velocidad, integramos ProxyTracer utilizando un BaseHTTPMiddleware personalizado y un cliente HTTP asíncrono (httpx) para asegurar que el bucle de eventos nunca se bloquee.

El Middleware

Esta implementación extrae con seguridad la IP real del cliente, utiliza un grupo de conexiones asíncronas para consultar ProxyTracer y devuelve un estricto 403 Forbidden si la variable proxy es verdadera.

import os import httpx from fastapi import FastAPI, Request, status from fastapi.responses import JSONResponse from starlette.middleware.base import BaseHTTPMiddleware app = FastAPI() class ProxyTracerMiddleware(BaseHTTPMiddleware): def __init__(self, app): super().__init__(app) self.api_key = os.getenv("PROXYTRACER_API_KEY") # Inicializar un cliente asíncrono persistente para la agrupación de conexiones y máxima velocidad self.client = httpx.AsyncClient(timeout=0.5) # Tiempo de espera estricto de 500ms async def dispatch(self, request: Request, call_next): # 1. Extraer de forma segura la IP real detrás de balanceadores de carga/proxies forwarded_for = request.headers.get("x-forwarded-for") if forwarded_for: ip = forwarded_for.split(",")[0].strip() else: ip = request.client.host if request.client else None # Omitir las IPs de desarrollo local if ip and ip not in ["127.0.0.1", "::1", "testclient"]: try: # 2. Consultar la API de ProxyTracer de forma asíncrona response = await self.client.get( f"https://api.proxytracer.com/v1/check/{ip}", headers={"Authorization": f"Bearer {self.api_key}"} ) if response.status_code == 200: data = response.json() # 3. Descartar la conexión inmediatamente si se detecta un proxy if data.get("proxy") is True: return JSONResponse( status_code=status.HTTP_403_FORBIDDEN, content={"error": "Access Denied: VPN or Proxy detected."} ) except httpx.RequestError as e: # Fail open: Registrar el error de red y permitir que la solicitud continúe print(f"ProxyTracer API timeout or failure: {e}") # 4. El tráfico está limpio, continuar hacia el manejador de la ruta return await call_next(request) # Aplicar el middleware globalmente app.add_middleware(ProxyTracerMiddleware)

Nota de Dependencia: Esta implementación requiere la biblioteca httpx para realizar solicitudes HTTP asíncronas. Instálala ejecutando pip install httpx.

Última actualización el