[Source image : stories – fr.freepik.com ]
Dans ce nouveau tutoriel, l’objectif est de vous montrer comment intégrer les fonctionnalités d’inscription et de connexion d’un utilisateur de votre application Django. Pour ce faire, nous pouvons utiliser le système d’authentification de base de Django, que nous enrichirons selon notre besoin.
Notre système d’authentification comprendra les fonctionnalités suivantes :
- L’inscription
- La connexion
- La déconnexion
- La réinitialisation de mot de passe
A l’exception de la fonctionnalité permettant d’inscrire un nouvel utilisateur, Django fournit des vues (“views” en anglais) par défaut pour toutes les autres fonctionnalités du système d’authentification. Nous aurons l’occasion de voir cela dans la suite du tutoriel, juste avant de personnaliser les templates associés à ces vues.
Déroulement du tutoriel
Dans ce tutoriel, organisé sous la forme de trois articles, nous commencerons par ajouter les fonctionnalités déjà intégrées dans le système d’authentification par défaut de Django. Nous mettrons en place les pages de connexion et de déconnexion d’un utilisateur, puis nous verrons comment ce dernier peut modifier/réinitialiser son mot de passe. Après cela, nous ajouterons la fonctionnalité d’inscription.
Ce premier article fait partie de la série suivante :
Première partie : Connexion et déconnexion
Deuxième partie : Réinitialisation de mot de passe
Troisième partie : Inscription d’un nouvel utilisateur
Dans cette première partie du tutoriel, nous mettrons en place un projet Django basique qui consistera en une application de prise de notes. Nous y ajouterons ensuite les premières briques de notre système d’authentification, à savoir les fonctionnalités de connexion (“login” en anglais) et de déconnexion (“logout” en anglais) de l’application.
Le code source de l’application qu’on nous allons construire est sur GitHub.
Préparation du projet de base
Je pars du principe que vous savez déjà comment créer un projet Django. Si ce n’est pas le cas, pas de panique! Même si on ne va pas tout expliquer en détail, sachez que cela a déjà fait l’objet d’autres articles (premier projet Django, comment réaliser une ToDoApp), que vous pouvez consulter à tout moment. Démarrons donc ce petit projet Django selon les étapes qui vont suivre.
Créer le répertoire du projet
Vérifiez que python est bien installé. Si ce n’est pas déjà fait, référez vous à cet article. Nous appellerons le répertoire du projet mynotes
.
D:\DEV>mkdir mynotes
D:\DEV>cd mynotes
Créer et activer un environnement virtuel
Une fois dans le répertoire du projet, on crée l’environnement virtuel venv
du projet et on l’active.
D:\DEV\mynotes>python -m venv venv
D:\DEV\mynotes>venv\Scripts\activate
Installer Django
On installe ensuite Django avec la commande pip install django
.
(venv) D:\DEV\mynotes>python -m pip install --upgrade pip
(venv) D:\DEV\mynotes>pip install django
Créer le projet et l’application
On nommera le projet django mynotes
. A la racine du projet, on crée l’application mynotesapp
.
(venv) D:\DEV\mynotes>django-admin startproject mynotes
(venv) D:\DEV\mynotes>cd mynotes
(venv) D:\DEV\mynotes\mynotes>django-admin startapp mynotesapp
Installer l’application dans le projet
Dans le fichier settings.py
du projet, on ajoute dans la liste des applications installées INSTALLED_APPS
notre application mynotesapp
.
... INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'mynotesapp', ] ...
Créer un modèle
Dans le fichier models.py
de l’application mynotesapp
, nous aurons à définir un modèle, que l’on nommera Note
. Ce modèle aura pour attributs un titre title
, un contenu content
, une date de création creation_date
et un auteur author
. Vous noterez que l’attribut author
est une clé étrangère (“Foreign Key” en anglais), qui fait référence au modèle User
prédéfinit dans Django.
from django.db import models from django.contrib.auth.models import User class Note(models.Model): title = models.CharField(max_length=100) content = models.TextField() creation_date = models.DateTimeField(auto_now_add=True) author = models.ForeignKey(User, on_delete=models.CASCADE) def __str__(self): return self.title
Effectuer les migrations
On crée la table correspondant à notre modèle dans la base de données du projet à l’aide du système de migration de Django.
(venv) D:\DEV\mynotes\mynotes>python manage.py makemigrations
(venv) D:\DEV\mynotes\mynotes>python manage.py migrate
Enregistrer le modèle dans AdminSite
Si on veut accéder à notre modèle à partir du portail d’administration, il suffit d’importer le modèle et de l’enregistrer dans admin.py
.
from django.contrib import admin from .models import Note admin.site.register(Note)
Créer un superutilisateur
Pour accéder au portail d’administration du projet, on crée un superutilisateur à l’aide de la commande ci-dessous :
(venv) D:\DEV\mynotes\mynotes> python manage.py createsuperuser
Il faut ensuite suivre les instructions et entrer un nom d’utilisateur et un mot de passe.
Alimenter les tables de données
Pour ajouter des données, on peut utiliser le portail d’administration du projet ou bien l’invite de commandes. Pour ce tutoriel, nous allons utiliser le site d’administration Django.
Ajouter des utilisateurs
Pour lancer l’application, on utilise la commande suivante :
(venv) D:\DEV\mynotes\mynotes>python manage.py runserver
On accède au portail d’administration via l’url http://127.0.0.1:8000/admin
. On se connecte en utilisant les identifiants de superutilisateur.
En cliquant sur Users, vous pourrez voir le compte du superuser
créé précédemment. Vous pourrez ajouter d’autres utilisateurs en cliquant sur le bouton Add
.
Formulaire de saisie d’un nouvel utilisateur dans le portail d’administration Django
Comme mentionné dans le formulaire d’ajout d’un nouvel utilisateur, vous devez d’abord saisir un nom d’utilisateur et un mot de passe.
Vous aurez ensuite l’occasion d’éditer le profil utilisateur et ajouter d’autres données comme une adresse e-mail par exemple. Cela nous sera utile lorsque nous ajouterons la fonctionnalité de réinitialisation du mot de passe.
Ajouter une adresse e-mail pour un utilisateur
Ajouter des Notes
L’ajout de notes est similaire à ce que nous venons de faire plus haut avec les utilisateurs. Pour inscrire une nouvelle note, on clique sur le bouton add
associé à la table Notes
, qui se trouve sous le volet de l’application MYNOTESAPP
. On saisie ensuite les données et on enregistre les modifications en cliquant sur save
.
Ajouter une note
Créer la page d’accueil
La Vue
La vue de notre page d’accueil consistera à afficher les notes d’un utilisateur connecté. Les notes seront listées dans le template home.html
.
from django.shortcuts import render from mynotesapp.models import Note def home(request): context ={ 'notes': Note.objects.all() } return render(request, 'home.html',context)
On va ensuite créer le répertoire templates
à la racine du projet et on y mettra les templates base.html
et home.html
.
(venv) D:\DEV\mynotes\mynotes>mkdir templates
On ajoute ce répertoire dans le fichier settings.py
du projet.
TEMPLATES = [ { ... 'DIRS': ['templates'], ... }, ]
Le Template de base
Pour le template base.html
qui sera la base commune aux différentes pages de notre projet, on peut partir de la page ci-après. Celle-ci est un exemple de template bootstrap.
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous"> <title>Accueil</title> </head> <body> <nav class="navbar navbar-expand-md navbar-dark bg-primary"> <a class="navbar-brand" href="{% url 'home' %}">Mes Notes</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarsExampleDefault"> <ul class="navbar-nav mr-auto"> <li class="nav-item active"> <a class="nav-link" href="{% url 'home' %}">Accueil<span class="sr-only">(current)</span></a> </li> </ul> </div> </nav> <br> <main role="main" class="container"> <div> {% block content %} {% endblock %} </div> </main> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script> </body> </html>
Le Template de la page d’accueil
Pour le template de la page d’accueil home.html
, on utilisera le code ci-après, consistant à afficher les notes des utilisateurs.
{% extends "base.html" %} {% block content %} {%if notes %} {% for note in notes %} <article class="media content-section"> <div class="media-body"> <h2><a class="article-title" href="#">{{ note.title }}</a></h2> <div class="article-metadata"> <small class="article-author">{{ note.author }}, </small> <small class="article-date">{{ note.creation_date }}</small> </div> <p class="article-content">{{ note.content }}</p> </div> </article> {% endfor %} {% else %} <h5 class="alert alert-warning">Vous n'avez pas encore de notes !</h5> {% endif %} {% endblock %}
Les Urls
Dans le répertoire de l’application, on définit le fichier urls.py
. On inscrit dans celui-ci le chemin vers notre page d’accueil.
from django.urls import path from mynotesapp import views urlpatterns =[ path('',views.home, name='home'), ]
Dans le fichier urls.py
du projet, on ajoute les chemins vers notre application mynotesapp
.
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('mynotesapp.urls')), ]
On relance ensuite le serveur pour vérifier que l’application fonctionne correctement à l’adresse http://127.0.0.1:8000
.
Page d’accueil
Pour l’instant, tout le monde peut voir les notes des utilisateurs et ce n’est pas ce que nous voulons. Nous allons donc ajouter un système d’authentification, pour que chaque utilisateur puisse se connecter et ne voir que ses propres notes.
Mise en place du système d’authentification
Créer une nouvelle application
Pour gérer les données et opérations d’authentification des utilisateurs, nous allons créer une nouvelle application que l’on nommera usersapp
.
(venv) D:\DEV\mynotes\mynotes>django-admin startapp usersapp
Enregistrer l’application
Dans le fichier de configuration du projet, on inscrit l’application dans la liste des applications installées.
... INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'mynotesapp', 'usersapp', ] ...
Ajouter les URLs
Dans un premier temps, nous allons créer, à la racine de l’application usersapp
, le fichier urls.py
et y ajouter les chemins qui mènent aux vues du système d’authentification par défaut de Django.
from django.urls import path, include urlpatterns =[ path('accounts/', include('django.contrib.auth.urls')), ]
La ligne path('accounts/', include('django.contrib.auth.urls'))
ci-dessus ajoute en réalité les lignes suivantes :
accounts/ login/ [name='login'] accounts/ logout/ [name='logout'] accounts/ password_change/ [name='password_change'] accounts/ password_change/done/ [name='password_change_done'] accounts/ password_reset/ [name='password_reset'] accounts/ password_reset/done/ [name='password_reset_done'] accounts/ reset/<uidb64>/<token>/ [name='password_reset_confirm'] accounts/ reset/done/ [name='password_reset_complete']
Django étant open-source, on peut voir la liste des chemins liés aux vues du système d’authentification par défaut dans le code source, répertorié dans GitHub. Les templates liés à ces vues et chemins seront personnalisés et placés dans un répertoire dédié.
... urlpatterns = [ path('login/', views.LoginView.as_view(), name='login'), path('logout/', views.LogoutView.as_view(), name='logout'), path('password_change/', views.PasswordChangeView.as_view(), name='password_change'), path('password_change/done/', views.PasswordChangeDoneView.as_view(), name='password_change_done'), path('password_reset/', views.PasswordResetView.as_view(), name='password_reset'), path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'), path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'), path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'), ]
Dans le répertoire templates
, il faudra donc créer un second répertoire que nous nommerons registration
et dans lequel seront ajoutés les différents templates liés aux vues du système d’authentification.
On doit aussi ajouter les chemins de l’application usersapp
au fichier urls.py
du projet.
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('mynotesapp.urls')), path('', include('usersapp.urls')), ]
Modifier la page de base
Au niveau de la barre de navigation, nous ajoutons des balises conditionnelles {% if user.is_authenticated %}
qui permettent de tester si un utilisateur est authentifié ou non dans la page base.html
. Si un utilisateur est connecté, on affiche son nom d’utilisateur et le lien de déconnexion. Mais dans le cas où un utilisateur est au niveau de la page d’accueil, sans s’être connecté, alors on affiche le lien de connexion et le lien d’inscription.
... <body> <h1>Mes notes</h1> <nav class="navbar navbar-expand-md navbar-dark bg-primary fixed-top"> <a class="navbar-brand" href="{% url 'home' %}">Mes Notes</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarsExampleDefault"> <ul class="navbar-nav mr-auto"> <li class="nav-item active"> <a class="nav-link" href="{% url 'home' %}">Accueil<span class="sr-only">(current)</span></a> </li> </ul> <ul class="navbar-nav ml-auto"> {% if user.is_authenticated %} <li class="nav-item active"> <a class="nav-link" href="#">{{user}},</a> </li> <li class="nav-item active"> <a class="nav-link" href="#">Déconnexion</a> </li> {% else %} <li class="nav-item active"> <a class="nav-link" href="#">Connexion</a> </li> <li class="nav-item active"> <a class="nav-link" href="#">Inscription</a> </li> {% endif %} </ul> </div> </nav> <main role="main" class="container"> <div> {% block content %} {% endblock %} </div> </main> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script> </body> ...
Si vous ne vous êtes pas déconnectés de la page d’administration et que vous affichez la page d’accueil de l’application, vous verrez le nom d’utilisateur du superuser
indiquant que celui-ci est connecté.
Page d’accueil
Dans la suite de ce tutoriel, nous allons définir les pages pour les vues du système d’authentification. Mais il faut savoir que les pages de déconnexion et de réinitialisation de mots de passe sont liées au portail d’administration. De ce fait, contrairement à l’opération de connexion pour laquelle il faut définir un template, des templates par défaut sont déjà fournis pour les opérations de déconnexion et de réinitialisation de mot de passe. Nous verrons plus loin comment il est possible de les redéfinir.
Construire la page de connexion
Pour avoir une page de connexion, nous devons définir un template login.html
et le placer dans templates/registration
.
Définir le template de connexion
Ce template consiste en un formulaire dans lequel l’utilisateur saisit ses informations de connexion pour accéder à ses notes.
{% extends "base.html" %} {% block content %} <h2>Se connecter </h2> <div> <form method="post"> {% csrf_token %} {% if form.non_field_errors %} {% for error in form.non_field_errors %} <p class="alert alert-danger">{{ error }}</p> {% endfor %} {% endif %} <table> {% for field in form %} <tr> <td>{{ field.label_tag }}</td> <td>{{ field }}</td> </tr> {% endfor %} </table> <button type="submit">se connecter</button> </form> </div> <div> <small> Pas encore inscrit.e? <a href="#"> S'inscrire </a> <br> Mot de passe oublié ? <a href="#"> Renouveler mon mot de passe </a> </small> </div> {% endblock %}
On peut ensuite redéfinir, dans le fichier urls.py
de usersapp
, le chemin vers la page de connexion pour ne pas utiliser l’url par défaut.
Redéfinir le chemin vers la page de connexion
Pour cela, on fait appel aux vues d’authentification (ligne 2) et on indique le chemin vers notre template (ligne 6).
Pour l’instant, nous n’allons pas supprimer la ligne 5 path('accounts/', include('django.contrib.auth.urls'))
, jusqu’à la fin du tutoriel. En effet, nous utiliserons celle-ci pour avoir un aperçu des tempates par défaut du système d’authentification avant de redéfinir chacun d’eux.
Nous accèderons à la page de connexion selon le chemin défini à la ligne 6. Ainsi, l’url de la page de connexion sera http://127.0.0.1:8000/login/
au lieu de http://127.0.0.1:8000/accounts/login/
.
from django.urls import path, include from django.contrib.auth import views as auth_views urlpatterns =[ path('accounts/', include('django.contrib.auth.urls')), path('login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name = 'login'), ]
Nous pouvons aussi spécifier l’url de connexion de notre choix dans le fichier de configuration comme ceci :
... LOGIN_URL = 'login'
Modifier la page de base
On modifie la page de base pour indiquer le chemin menant à la page de connexion (ligne 12). Nous pouvons faire de même pour le lien de déconnexion qui mène à la page de déconnexion par défaut (ligne 8).
... <ul class="navbar-nav ml-auto"> {% if user.is_authenticated %} <li class="nav-item active"> <a class="nav-link" href="#">{{user}},</a> </li> <li class="nav-item active"> <a class="nav-link" href="{% url 'logout' %}">Déconnexion</a> </li> {% else %} <li class="nav-item active"> <a class="nav-link" href="{% url 'login' %}">Connexion</a> </li> <li class="nav-item active"> <a class="nav-link" href="#">Inscription</a> </li> {% endif %} </ul> ...
Tester la page de connexion
Pour tester notre page de connexion, assurez-vous que vous vous-êtes déconnectés en tant que super-utilisateur au niveau du portail d’administration de notre application. Redirigez-vous ensuite vers la page d’accueil pour vous connecter en tant qu’utilisateur simple ou super-utilisateur. Pour cela, cliquez sur le lien Connexion
dans la barre de navigation.
Page d’accueil
Le lien de connexion mène à l’adresse http://127.0.0.1:8000/login/
qui doit ressembler à ceci.
Formulaire de connexion
Après avoir entré les données de connexion, vous êtes automatiquement redirigé vers la page http://127.0.0.1:8000/accounts/profile/
. Ce n’est pas ce que nous voulons.
Redirection vers la page des profils
Pour ne pas atterrir sur la page des profils, on change la redirection vers la page d’accueil. Pour cela on ajoute dans le fichier de configuration du projet la ligne suivante :
LOGIN_REDIRECT_URL = 'home'
Il faut ensuite revenir à la page, se déconnecter en cliquant sur le lien Déconnexion
.
Vous serez alors redirigés vers la page de déconnexion par défaut du portail d’administration Django à l’adresse http://127.0.0.1:8000/accounts/logout/
.
Page de déconnexion par défaut en anglais
Comme vous pouvez le voir, la langue par défaut dans notre projet est l’anglais. De ce fait, le portail d’administration et les templates par défaut contenant un formulaire, un message ou des instructions sont en langue anglaise. On peut évidemment définir la langue de notre choix dans le fichier de configuration en modifiant la valeur de LANGUAGE_CODE comme ceci :
LANGUAGE_CODE = 'fr-fr'
Rafraichissez la page de déconnexion pour vous assurer que celle-ci est bien dans la langue désirée.
Page de déconnexion
Nous pouvons maintenant tester une seconde fois la page de connexion. Allez dans la page d’accueil et cliquez sur Connexion. Dans la page de connexion, entrez vos identifiants et cliquez sur le bouton Se connecter. Vous devriez être redirigé vers la page d’accueil.
Redirection vers la page d’accueil
Personnaliser la page de déconnexion
Comme nous venons de l’observer plus haut, la page de déconnexion par défaut est liée au portail d’administration. Nous allons modifier cette page, en redéfinissant le template ainsi que l’url associés à la vue de déconnexion LogoutView
.
Définir le template de déconnexion
Commençons par le template qui comportera les lignes suivantes :
{% extends "base.html" %} {% block content %} <h2>Vous êtes déconnecté. </h2> <a href="{% url 'login' %}">Se reconnecter</a> {% endblock %}
Redéfinir le chemin vers la page de déconnexion
Nous devons ensuite ajouter dans la liste urlpatterns
le chemin vers la page de déconnexion, comme montrée ci-dessous (en ligne 6).
... urlpatterns =[ path('accounts/', include('django.contrib.auth.urls')), path('login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name = 'login'), path('logout/', auth_views.LogoutView.as_view(template_name='registration/logout.html'), name = 'logout'), ]
Test la page de déconnexion
On peut maintenant tester la page de déconnexion.
Page de déconnexion personnalisée
Gérer les permissions
Dans cette dernière section, voyons comment on peut gérer la sécurité des accès aux données. Nous allons apporter les modifications nécessaires à notre vue home()
pour qu’elle n’affiche que les notes de la personne authentifiée. Cela veut dire qu’il faut être connecté en premier lieu pour accéder à la page d’accueil et lister ses propres notes. Pour ce faire, on importe ce qu’on appelle un décorateur (“decorator” en anglais), comme cela est montré en ligne 3, puis on l’inscrit juste avant la fonction à modifier (ligne 5).
from django.shortcuts import render from mynotesapp.models import Note from django.contrib.auth.decorators import login_required @login_required def home(request): context ={ 'notes': Note.objects.filter(author=request.user) } return render(request, 'home.html',context)
Les décorateurs de vue sont des fonctions fournies par le Framework Django qui permettent de modifier une fonction ou d’ajouter à celle-ci d’autres fonctionnalités.
Dans le cas présent nous utiliserons un décorateur d’authentification login_required
qui va sécuriser et restreindre l’accès à la page d’accueil selon qu’un utilisateur est authentifiée ou non. Ainsi, si un utilisateur tente d’accéder à la page d’accueil pour la première fois, il sera automatiquement redirigé vers la page de connexion, dont l’url LOGIN_URL
est définie dans le fichier de configuration settings.py
.
Redirection vers la page de connexion
En d’autres termes, avec ce décorateur l’utilisateur est forcé de s’authentifier pour accéder à ses notes au niveau de la page d’accueil.
Une fois authentifié, l’utilisateur est redirigé vers la page d’accueil et peut accéder à ses notes seulement. Cette restriction dans l’affichage des notes est réalisée à l’aide de la fonction filter(author=request.user)
appliquée aux objets Note
(ligne 8) et on limite ainsi la liste des notes à celles écrites par l’utilisateur connecté.
Page d’accueil listant les notes de l’utilisateur connecté
Conclusion
Dans cette première partie du tutoriel consacrée à la mise en place d’un système d’authentification dans une application web Django, nous avons vu comment construire les pages de connexion et de déconnexion. Nous avons montré comment limiter l’accès aux données et gérer les permissions à l’aide de décorateurs. Dans le prochain article de la série, nous opérerons de manière similaire pour le système de réinitialisation de mot de passe. Enfin, si vous avez des questions concernant ce premier article, je serais ravie d’y répondre en commentaires.