Python >> Tutoriel Python >  >> Python

Suivi des données utilisateur quotidiennes dans Django avec django-user-visit

Il peut être fastidieux de déterminer quelles données suivre, de créer des modèles de données et de créer un middleware pour votre projet Django si vous souhaitez simplement collecter des informations de base sur les clients qui se connectent à votre application Web. Heureusement, la bibliothèque django-user-visit est un projet Django pratique qui gère rapidement toute cette complexité pour vous. Dans ce didacticiel, nous allons apprendre à utiliser django-user-visit dans un nouveau projet Django pour ajouter un suivi quotidien des données de visite aux projets Django.

Lorsque nous avons terminé, nous pouvons afficher des informations comme celles-ci dans Django Admin :

Exigences du projet

Assurez-vous que Python 3 est installé, car Python 2 a atteint sa fin de vie au début de 2020 et n'est plus pris en charge. De préférence, vous devriez avoir Python 3.7 ou supérieur installé dans votre environnement de développement.

Nous utiliserons les dépendances suivantes pour terminer ce didacticiel :

  • Framework Web Django, version 3.0.8
  • django-user-visite,version 0.4

Tout le code de cet article de blog est disponible en open source sous licence MIT sur GitHub sous le répertoire track-daily-user-data-django-user-visit du référentiel blog-code-examples. Utilisez le code source comme vous le souhaitez pour vos propres projets .

Configuration de l'environnement de développement

Accédez au répertoire dans lequel vous conservez vos environnements virtuels Python.Créez un nouvel environnement virtuel pour ce projet à l'aide de la commande suivante.

Démarrez le projet Django en créant un nouvel environnement virtuel à l'aide de la commande suivante. Je recommande d'utiliser un répertoire séparé tel que ~/venvs/ (le tilde est un raccourci pour le home de votre utilisateur répertoire) afin que vous sachiez toujours où se trouvent tous vos environnements virtuels.

python3 -m venv ~/venvs/djuservisit

Activez le virtualenv avec le activate script shell :

source ~/venvs/djuservisit/bin/activate

Une fois la commande ci-dessus exécutée, l'invite de commande changera de sorte que le nom de virtualenv soit ajouté au format d'invite de commande d'origine, donc si votre invite est simplement $ , il ressemblera maintenant à ceci :

(djuservisit) $

N'oubliez pas que vous devez activer votre environnement virtuel dans chaque nouvelle fenêtre de terminal où vous souhaitez utiliser des dépendances dans l'environnement virtuel.

Nous pouvons maintenant installer le Djangopackage dans le virtualenv activé mais autrement vide.

pip install django==3.0.8 django-user-visit==0.4

Recherchez une sortie similaire à la suivante pour confirmer que les packages appropriés ont été correctement installés à partir de PyPI.

(djuservisit) $ pip install django==3.0.8 django-user-visit==0.4
Collecting django==3.0.8
  Using cached https://files.pythonhosted.org/packages/ca/ab/5e004afa025a6fb640c6e983d4983e6507421ff01be224da79ab7de7a21f/Django-3.0.8-py3-none-any.whl
Collecting django-user-visit==0.4
  Downloading https://files.pythonhosted.org/packages/23/ef/d3ec22c3a897192e267389d6ee59ce1858f5ede262b078f93211aff110e7/django_user_visit-0.4-py3-none-any.whl
Collecting sqlparse>=0.2.2 (from django==3.0.8)
  Using cached https://files.pythonhosted.org/packages/85/ee/6e821932f413a5c4b76be9c5936e313e4fc626b33f16e027866e1d60f588/sqlparse-0.3.1-py2.py3-none-any.whl
Collecting asgiref~=3.2 (from django==3.0.8)
  Using cached https://files.pythonhosted.org/packages/d5/eb/64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6/asgiref-3.2.10-py3-none-any.whl
Collecting pytz (from django==3.0.8)
  Using cached https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl
Collecting user-agents<3.0,>=2.1 (from django-user-visit==0.4)
  Using cached https://files.pythonhosted.org/packages/1b/be/82e4d20a7716d8e5de98b948edcecff9bb237e6718c3831bd92794fe9821/user-agents-2.1.tar.gz
Collecting ua-parser>=0.9.0 (from user-agents<3.0,>=2.1->django-user-visit==0.4)
  Using cached https://files.pythonhosted.org/packages/9d/22/4d16b08db329fd440eed366d35e4dd7195c9babb4ecac5218f28081522a2/ua_parser-0.10.0-py2.py3-none-any.whl
Installing collected packages: sqlparse, asgiref, pytz, django, ua-parser, user-agents, django-user-visit
  Running setup.py install for user-agents ... done
Successfully installed asgiref-3.2.10 django-3.0.8 django-user-visit-0.4 pytz-2020.1 sqlparse-0.3.1 ua-parser-0.10.0 user-agents-2.1

Nos dépendances sont installées afin que nous puissions maintenant créer notre projet et commencer à coder.

Création de l'application

Nous avons tout ce dont nous avons besoin pour commencer à créer notre application.

Nous pouvons utiliser le Django django-admin outil pour créer la structure de code passe-partout pour lancer notre projet. Allez dans le répertoire où vous développez vos applications. Par exemple, j'utilise généralement /Users/matt/devel/py/ pour tous les projets myPython. Exécutez ensuite la commande suivante pour démarrer un projet Django nommé djuservisit :

django-admin.py startproject djuservisit

Notez que dans ce didacticiel, nous utilisons le même nom pour le répertoire du projet virtualenv et Django, mais ils peuvent avoir des noms différents si vous préférez cela pour organiser vos propres projets.

Le django-admin la commande crée un répertoire nommé djuservisit ainsi que plusieurs sous-répertoires que vous devriez connaître si vous avez déjà travaillé avec Django.

Modifiez les répertoires dans le nouveau projet.

cd djuservisit

Ouvrir djuservisit/djuservisit/settings.py . Ajoutez le user_visits app et son middleware à settings.py en insérant les deux lignes en surbrillance :

# djuservisit/djuservisit/settings.py
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user_visit',
]

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'user_visit.middleware.UserVisitMiddleware',
]

Assurez-vous de changer le DEBUG par défaut et SECRET_KEY valeurs en settings.py avant de déployer du code en production. Sécurisez correctement votre application avec les informations des checklists de déploiement Djangoproduction afin de ne pas ajouter votre projet à la liste des applications piratées sur le web.

Enregistrez et fermez settings.py .

Créez un superutilisateur Django pour pouvoir accéder à l'administrateur Django. Allez dans le répertoire de base de ce projet et utilisez le manage.py fichier avec la commande suivante :

python manage.py createsuperuser

Suivez les invites et entrez les valeurs pour le nom d'utilisateur, l'adresse e-mail et le mot de passe que vous souhaitez que votre superutilisateur Django local ait. Ensuite, nous testerons le fonctionnement de cette bibliothèque lorsqu'un utilisateur visite une page créée par notre application Web Django.

Test django-user-visit

Testons notre application simple. Exécutez le serveur de développement avec la commande suivante :

python manage.py runserver

Le serveur de développement Django devrait démarrer sans problème.

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
July 19, 2020 - 13:01:41
Django version 3.0.8, using settings 'djuservisit.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Ouvrez un navigateur Web et accédez à "http://localhost:8000".

C'est la page par défaut fournie par Django en l'absence de toute autre URL à servir à l'URL racine, mais cela fonctionne pour nos besoins.

Accédez à Django Admin en modifiant l'URL de votre navigateur en "http://localhost:8000/admin". La page de connexion Django Admin apparaîtra.

Entrez le nom d'utilisateur et le mot de passe du superutilisateur que vous venez de créer avec le manage.py pour vous connecter. Ensuite, vous verrez le tableau de bord d'administration de Django.

Le "Journal de visite de l'utilisateur" a déjà été ajouté à l'Admin. Cliquez sur le lien "Visites des utilisateurs".

La liste de tous les utilisateurs qui ont visité par jour s'affichera.

Cliquez sur l'une des visites pour voir des données plus détaillées sur l'enregistrement, comme vous le feriez avec n'importe quelle extension Django Admin.

Cette bibliothèque a été assez facile à installer pour les informations qu'elle regroupe pour vous. Examinons ensuite de plus près le modèle ORM de Django qui alimente cette bibliothèque.

Inspecter le modèle django-user-visit

Nous avons confirmé que django-user-visit est correctement installé. Examinons de plus près le modèle fourni par la bibliothèque pour stocker les données utilisateur.

Jetez un œil au code source fordjango-user-visit/user_visit/models.pyon GitHub. Vous trouverez ci-dessous un extrait avec les lignes pertinentes de ce fichier source. J'ai mis en surbrillance quelques lignes qui seront discutées sous l'extrait de code.

## ... source code abbreviated ...

class UserVisit(models.Model):
    """
    Record of a user visiting the site on a given day.
    This is used for tracking and reporting - knowing the volume of visitors
    to the site, and being able to report on someone's interaction with the site.
    We record minimal info required to identify user sessions, plus changes in
    IP and device. This is useful in identifying suspicious activity (multiple
    logins from different locations).
    Also helpful in identifying support issues (as getting useful browser data
    out of users can be very difficult over live chat).
    """

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, related_name="user_visits", on_delete=models.CASCADE
    )
    timestamp = models.DateTimeField(
        help_text="The time at which the first visit of the day was recorded",
        default=timezone.now,
    )
    session_key = models.CharField(help_text="Django session identifier", max_length=40)
    remote_addr = models.CharField(
        help_text=(
            "Client IP address (from X-Forwarded-For HTTP header, "
            "or REMOTE_ADDR request property)"
        ),
        max_length=100,
        blank=True,
    )
    ua_string = models.TextField(
        "User agent (raw)", help_text="Client User-Agent HTTP header", blank=True,
    )
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    hash = models.CharField(
        max_length=32,
        help_text="MD5 hash generated from request properties",
        unique=True,
    )
    created_at = models.DateTimeField(
        help_text="The time at which the database record was created (!=timestamp)",
        auto_now_add=True,
    )

    objects = UserVisitManager()

    class Meta:
        get_latest_by = "timestamp"

    def __str__(self) -> str:
        return f"{self.user} visited the site on {self.timestamp}"

    def __repr__(self) -> str:
        return f"<UserVisit id={self.id} user_id={self.user_id} date='{self.date}'>"

    def save(self, *args: Any, **kwargs: Any) -> None:
        """Set hash property and save object."""
        self.hash = self.md5().hexdigest()
        super().save(*args, **kwargs)

    @property
    def user_agent(self) -> user_agents.parsers.UserAgent:
        """Return UserAgent object from the raw user_agent string."""
        return user_agents.parsers.parse(self.ua_string)

    @property
    def date(self) -> datetime.date:
        """Extract the date of the visit from the timestamp."""
        return self.timestamp.date()

    # see https://github.com/python/typeshed/issues/2928 re. return type
    def md5(self) -> hashlib._Hash:
        """Generate MD5 hash used to identify duplicate visits."""
        h = hashlib.md5(str(self.user.id).encode())  # noqa: S303
        h.update(self.date.isoformat().encode())
        h.update(self.session_key.encode())
        h.update(self.remote_addr.encode())
        h.update(self.ua_string.encode())
        return h

Quelques éléments à noter en fonction de ce qui précède :

  • Le UserVisit le modèle correspond au modèle utilisateur Django en utilisant le user = models.ForeignKey... ligne
  • Le code utilise le save fonction pour s'assurer que certains champs sont remplis automatiquement, comme le hash propriété utilisant le hashlib modules
  • Cette bibliothèque dépend de la bibliothèque user_agents pour analyser l'User-Agent du navigateur utilisé par le client

La lecture du code source de bibliothèques telles que django-user-visit est utile non seulement pour savoir ce qu'il fait sous les couvertures, mais aussi pour apprendre de nouvelles façons de coder vos propres applications.

Jetez un œil aux pages d'exemples de code Django et d'extensions Django pour voir plus de projets avec un bon exemple de code Python dont vous pouvez apprendre.

Ressources supplémentaires

Nous venons de terminer la création d'une application qui suit les visites quotidiennes des utilisateurs avec la bibliothèque Django-user-visit.

Ensuite, essayez quelques-uns de ces autres didacticiels Django connexes :

  • Utiliser rapidement Bootstrap 4 dans un modèle Django avec un CDN
  • Comment ajouter des cartes aux projets d'application Web Django avec Mapbox
  • Surveillance des projets Django avec Rollbar

Des questions? Faites-le moi savoir via un ticket de problème GitHub sur le référentiel Full Stack Python, sur Twitter@fullstackpythonou @mattmakai.