Wenn Sie entscheiden, dass der Client direkt auf Django zugreifen soll, können Sie die IP-Adresse einfach über den HTTP-Header "REMOTE_ADDR" abrufen.
views.py
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
#Aus dem Anforderungsobjekt'REMOTE_ADDR'Holen Sie sich den Header.
client_addr = request.META.get('REMOTE_ADDR')
#Die erfasste Adresse wird zurückgegeben, um den Vorgang zu überprüfen.
return HttpResponse(client_addr)
Wenn bei der obigen Methode jedoch ein Reverse-Proxy wie Nginx zwischen dem Client und Django vorhanden ist, ist die IP-Adresse, die mit "REMOTE_ADDR" abgerufen werden kann, die Adresse des Reverse-Proxys (z. B. befindet sich Nginx auf demselben Host). Wenn ja, ist es 127.0.0.1
).
Wenn die Übertragung mehr als einmal in der Mitte erfolgt, können Sie auch auf den HTTP-Header "HTTP_X_FORWARDED_FOR" zugreifen, um die IP-Adresse der Übertragungsroute als durch Kommas getrennte Zeichenfolge abzurufen. Rufen Sie daher die IP-Adresse des Clients von diesem ersten Element ab. tun können.
Wenn es keinen HTTP_X_FORWARDED_FOR-Header gibt, handelt es sich um einen direkten Zugriff. Rufen Sie ihn daher wie oben beschrieben mit REMOTE_ADDR auf.
views.py
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
# 'HTTP_X_FORWARDED_FOR'Ermitteln Sie die IP-Adresse der Übertragungsroute anhand des Headers.
forwarded_addresses = request.META.get('HTTP_X_FORWARDED_FOR')
if forwarded_addresses:
# 'HTTP_X_FORWARDED_FOR'Wenn es einen Header gibt:Holen Sie sich das erste Element der Transferroute.
client_addr = forwarded_addresses.split(',')[0]
else:
# 'HTTP_X_FORWARDED_FOR'Wenn es keinen Header gibt:Weil es eine direkte Verbindung ist'REMOTE_ADDR'Siehe die Überschrift.
client_addr = request.META.get('REMOTE_ADDR')
#Die erfasste Adresse wird zurückgegeben, um den Vorgang zu überprüfen.
return HttpResponse(client_addr)
Installieren Sie django-ipware mit pip.
python
pip3 install django-ipware
Wenn Sie es importieren und die Funktion get_client_ip
verwenden, können Sie die Adresse des Clients in nur einer Zeile abrufen, und natürlich unterstützt es Reverse Proxy.
views.py
from django.http import HttpResponse
from django.views import View
from ipware import get_client_ip
class MyView(View):
def get(self, request):
client_addr, _ = get_client_ip(request)
return HttpResponse(client_addr)
Der referenzierte HTTP-Header erhält die Adresse des Clients in der folgenden Prioritätsreihenfolge sowie "HTTP_X_FORWARDED_FOR" und "REMOTE_ADDR".
python
# The default meta precedence order
IPWARE_META_PRECEDENCE_ORDER = (
'HTTP_X_FORWARDED_FOR', 'X_FORWARDED_FOR', # <client>, <proxy1>, <proxy2>
'HTTP_CLIENT_IP',
'HTTP_X_REAL_IP',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'HTTP_VIA',
'REMOTE_ADDR',
)
Sie können die Standardpriorität auch mit der angegebenen Priorität überschreiben, wenn Sie die Funktion "get_client_ip" aufrufen.
python
client_addr, is_routable = get_client_ip(request, request_header_order=['X_FORWARDED_FOR', 'REMOTE_ADDR'])
Stack Overflow "How do I get user IP address in django?" https://stackoverflow.com/questions/4581789/how-do-i-get-user-ip-address-in-django
GitHub - un33k/django-ipware "A Django application to retrieve client's IP address" https://github.com/un33k/django-ipware
Recommended Posts