Si vous décidez que le client accédera directement à Django, vous pouvez obtenir l'adresse IP en regardant simplement le `` REMOTE_ADDR '' dans l'en-tête HTTP.
views.py
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
#À partir de l'objet de requête'REMOTE_ADDR'Obtenez l'en-tête.
client_addr = request.META.get('REMOTE_ADDR')
#L'adresse acquise est retournée telle quelle pour vérifier l'opération.
return HttpResponse(client_addr)
Cependant, avec la méthode ci-dessus, s'il existe un proxy inverse tel que Nginx entre le client et Django, l'adresse IP qui peut être obtenue avec `` REMOTE_ADDR '' sera l'adresse proxy inverse (par exemple, Nginx est sur le même hôte). S'il y en a, ce sera 127.0.0.1
).
Si le transfert est effectué plus d'une fois au milieu, vous pouvez également vous référer à l'en-tête HTTP `` HTTP_X_FORWARDED_FOR '' pour obtenir l'adresse IP de la route de transfert sous forme de chaîne séparée par des virgules, afin d'obtenir l'adresse IP du client à partir de ce premier élément. peut faire.
De plus, s'il n'y a pas d'en-tête HTTP_X_FORWARDED_FOR '', il s'agit d'un accès direct, alors obtenez-le avec
REMOTE_ADDR '' comme ci-dessus.
views.py
from django.http import HttpResponse
from django.views import View
class MyView(View):
def get(self, request):
# 'HTTP_X_FORWARDED_FOR'Obtenez l'adresse IP de la route de transfert en vous référant à l'en-tête.
forwarded_addresses = request.META.get('HTTP_X_FORWARDED_FOR')
if forwarded_addresses:
# 'HTTP_X_FORWARDED_FOR'S'il y a un en-tête:Obtenez le premier élément de l'itinéraire de transfert.
client_addr = forwarded_addresses.split(',')[0]
else:
# 'HTTP_X_FORWARDED_FOR'S'il n'y a pas d'en-tête:Parce que c'est une connexion directe'REMOTE_ADDR'Reportez-vous à l'en-tête.
client_addr = request.META.get('REMOTE_ADDR')
#L'adresse acquise est retournée telle quelle pour vérifier l'opération.
return HttpResponse(client_addr)
Installez django-ipware avec pip.
python
pip3 install django-ipware
Si vous l'importez et utilisez la fonction get_client_ip
, vous pouvez obtenir l'adresse du client en une seule ligne, et bien sûr, il prend en charge le proxy inverse.
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)
L'en-tête HTTP référencé obtient l'adresse du client avec la priorité suivante par défaut, ainsi que `` HTTP_X_FORWARDED_FOR' et
'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',
)
Vous pouvez également remplacer la priorité par défaut par la priorité spécifiée lors de l'appel de la fonction get_client_ip
.
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