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 leuser = models.ForeignKey...
ligne - Le code utilise le
save
fonction pour s'assurer que certains champs sont remplis automatiquement, comme lehash
propriété utilisant lehashlib
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.