web-dev-qa-db-fra.com

Comment stocker l'adresse IP dans la base de données et Django admin

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.

Django-admin-ip

22
Radek

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

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

8
dhana

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) 
5
Prashant

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.

3
Sahil kalra