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

1""" 

2IP real del cliente, con la misma regla que ya usa DRF para el limite de peticiones. 

3 

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 

9 

10 

11def get_client_ip(request): 

12 """ 

13 Devuelve la IP del cliente segun REST_FRAMEWORK[NUM_PROXIES]: 

14 

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') 

23 

24 num_proxies = getattr(settings, 'REST_FRAMEWORK', {}).get('NUM_PROXIES') 

25 

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() 

32 

33 return ''.join(xff.split()) if xff else remote_addr