Coverage for api\client_ip.py: 87.5%
12 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-30 20:58 +0200
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-30 20:58 +0200
1"""
2IP real del cliente, con la misma regla que ya usa DRF para el limite de peticiones.
4Existe porque REMOTE_ADDR no es de fiar ya que daphne arranca con --proxy-headers para que la IP no sea siempre
5la de Caddy, y al hacerlo sustituye REMOTE_ADDR por la primera entrada de X-Forwarded-For, que es justo la que
6pone el cliente, el proxy añde la suya al final de la cabecera en lugar de sustituirla
7"""
8from django.conf import settings
11def get_client_ip(request):
12 """
13 Devuelve la IP del cliente segun REST_FRAMEWORK[NUM_PROXIES]:
15 Con NUM_PROXIES = n (n > 0) se coge la entrada n-esima (por la derecha)
16 de X-Forwarded-For, que es la que ha escrito el ultimo proxy de confianza
17 Con NUM_PROXIES = 0, o sin cabecera, se usa REMOTE_ADDR (se debe usar si no hay
18 proxy delante donde ese valor si es el del socket y no se puede falsear)
19 Sin NUM_PROXIES definido va al comportamiento por defecto de DRF, que usa la cadena entera
20 """
21 xff = request.META.get('HTTP_X_FORWARDED_FOR')
22 remote_addr = request.META.get('REMOTE_ADDR')
24 num_proxies = getattr(settings, 'REST_FRAMEWORK', {}).get('NUM_PROXIES')
26 if num_proxies is not None: 26 ↛ 33line 26 didn't jump to line 33 because the condition on line 26 was always true
27 if num_proxies == 0 or xff is None:
28 return remote_addr
29 addrs = xff.split(',')
30 client_addr = addrs[-min(num_proxies, len(addrs))]
31 return client_addr.strip()
33 return ''.join(xff.split()) if xff else remote_addr