Voudrait stocker l'adresse IP de tous ceux qui viennent sur le site. Quelle est la meilleure approche pour ce faire. Disons avoir un modèle
class ip(models.Model):
pub_date = models.DateTimeField('date published')
ip_address = models.GenericIPAddressField()
Quel serait le code dans les modèles ou dans les vues ou quelque part que je voudrais l'enregistrer dans la base de données voudrais également l'enregistrer avec des informations sur l'agent utilisateur similaires à cela.
Dans views.py:
views.py:
....
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ipaddress = x_forwarded_for.split(',')[-1].strip()
else:
ipaddress = request.META.get('REMOTE_ADDR')
get_ip= ip() #imported class from model
get_ip.ip_address= ipaddress
get_ip.pub_date = datetime.date.today() #import datetime
get_ip.save()
J'ai donné l'exemple de @Sahil Kalra en utilisant un middleware,
Modèle:
class IpAddress(models.Model):
pub_date = models.DateTimeField('date published')
ip_address = models. GenericIPAddressField()
Middleware:
import datetime
class SaveIpAddressMiddleware(object):
"""
Save the Ip address if does not exist
"""
def process_request(self, request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[-1].strip()
else:
ip = request.META.get('REMOTE_ADDR')
try:
IpAddress.objects.get(ip_address=ip)
except IpAddress.DoesNotExist: #-----Here My Edit
ip_address = IpAddress(ip_address=ip, pub_date=datetime.datetime.now())
ip_address.save()
return None
Enregistrez le middleware quelque part dans votre dossier de projet et dans le fichier de paramètres, ajoutez ce middleware. Voici la référence Comment définir Django middleware dans le fichier de paramètres
Vous pouvez récupérer l'adresse IP très facilement dans votre views.py.
def get_ip_address (request): "" "use requestobject pour récupérer l'adresse IP de la machine client" "" x_forwarded_for = request.META.get ('HTTP_X_FORWARDED_FOR') si x_forwarded_for: ip = x_forwarded_for.split (',') [0] sinon: ip = request.META.get ('REMOTE_ADDR') ### Adresse IP réelle de l'ordinateur client Renvoyer l'ip Def home (demande): "" "Vos vies pour gérer la demande http" " " ip_address = get_ip_address (demande)
Comme vous voulez enregistrer l'agent utilisateur indépendamment de l'URL ou de la vue qui l'appelle , cela n'a aucun sens d'écrire ce code dans les vues ou Modèles.
Vous devriez écrire un middleware qui ferait le travail pour vous. En savoir plus sur Django middleware: https://docs.djangoproject.com/en/1.6/topics/http/middleware/
Vous souhaitez contourner la méthode process_request()
de votre middleware personnalisé pour obtenir l'adresse IP et l'agent utilisateur de l'objet de requête et le stocker dans Modèle IP
Le lien ci-dessus vous donnera une clarté absolue sur ce que vous devez faire.