2022-06-22 21:51:43 -04:00
|
|
|
from netaddr import IPAddress
|
2022-06-22 17:01:07 -04:00
|
|
|
|
|
|
|
__all__ = (
|
|
|
|
'get_client_ip',
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def get_client_ip(request, additional_headers=()):
|
|
|
|
"""
|
|
|
|
Return the client (source) IP address of the given request.
|
|
|
|
"""
|
|
|
|
HTTP_HEADERS = (
|
|
|
|
'HTTP_X_REAL_IP',
|
|
|
|
'HTTP_X_FORWARDED_FOR',
|
|
|
|
'REMOTE_ADDR',
|
|
|
|
*additional_headers
|
|
|
|
)
|
|
|
|
for header in HTTP_HEADERS:
|
|
|
|
if header in request.META:
|
|
|
|
client_ip = request.META[header].split(',')[0]
|
|
|
|
try:
|
2022-06-22 21:51:43 -04:00
|
|
|
return IPAddress(client_ip)
|
2022-06-22 17:01:07 -04:00
|
|
|
except ValueError:
|
|
|
|
raise ValueError(f"Invalid IP address set for {header}: {client_ip}")
|
|
|
|
|
|
|
|
# Could not determine the client IP address from request headers
|
|
|
|
return None
|