Système utilisateur — Inscription, Connexion, Déconnexion
Dans ce chapitre, vous apprendrez à utiliser le système d'authentification intégré de Django pour implémenter les fonctionnalités d'inscription, de connexion et de déconnexion des utilisateurs.
Système d'authentification intégré de Django
Django est fourni avec un module complet d'authentification des utilisateurs :
- Intégré
UserModèles (nom d'utilisateur, mot de passe, e-mail, etc.) - Vues de connexion/déconnexion intégrées (pas besoin d'écrire la logique vous-même)
- Gestion intégrée des autorisations et des groupes
- Validation des formulaires et protection de sécurité (CSRF, XSS)
Ce module estdjango.contrib.authIl est enregistré dans INSTALLED_APPS par défaut lors de la création du projet.
Page d'inscription
Django dispose de vues de connexion/déconnexion intégrées, mais pas de vue d'inscription intégrée, nous devons donc l'écrire nous-mêmes.
Étape 1 : Créer un formulaire d'inscription
Exemple
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import Utilisateur
class RegisterForm(UserCreationForm):
Formulaire d'inscription personnalisé : hérite de UserCreationForm, ajoute un champ e-mail
email = forms.EmailField(
label=E-mail,
required=True,
help_text=Veuillez saisir une adresse e-mail valide.
)
class Meta:
model = User
fields = ['username', 'email', 'password1', 'password2']
labels = {
'username': Nom d'utilisateur,
}
Étape 2: Écrire la vue d'inscription
Exemple
from django.shortcuts import render, redirect
from django.contrib.auth import login
from django.contrib import messages
from .forms import RegisterForm
def register(request):
"""Vue d'inscription de l'utilisateur"""
# Si l'utilisateur est déjà connecté, rediriger directement vers la page d'accueil.
if request.user.is_authenticated:
return redirect('index')
if request.method == 'POST':
# L'utilisateur a soumis le formulaire d'inscription
form = RegisterForm(request.POST)
if form.is_valid():
user = form.save() # Enregistrer l'utilisateur dans la base de données
login(request, user) # Connexion automatique après l'inscription
messages.success(request, fInscription réussie, bienvenue, {user.username} !)
return redirect('index')
else:
# Requête GET : Affiche un formulaire d'inscription vide
formulaire = RegisterForm()
return render(request, 'blog/register.html', {
'form': form,
'title': 'Inscription - EXAMPLE Blog'
})
de Django
messagesCe framework est utilisé pour transmettre des messages à usage unique entre les requêtes (tels que « Inscription réussie »). En affichant la zone des messages dans le template, les utilisateurs peuvent voir le retour d'opération. Il fonctionne avec la session, et le message disparaît automatiquement après avoir été affiché une fois.
Connexion et déconnexion
Django dispose de vues de connexion et de déconnexion intégrées ; il vous suffit de les inclure dans la configuration des URL.
Exemple
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
url = [
path('', indexviews., index=name),
path('post/<int:pk>/', views.post_detail, name='post_detail'),
path('register/', views.register, name='register'),
# Vue de connexion intégrée à Django
# template_name : spécifie quel template utiliser
path('login/', auth_views.LoginView.as_view(
template_name='blog/login.html',
redirect_authenticated_user=True # Les utilisateurs connectés qui visitent login sont redirigés directement.
), name='login'),
# Vue de déconnexion intégrée à Django
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
Configurez les adresses de redirection pour la connexion et la déconnexion dans settings.py :
Exemple
LOGIN_URL = 'login' # Les utilisateurs non authentifiés qui accèdent à des pages protégées sont redirigés vers la page de connexion.
LOGIN_REDIRECT_URL = 'index' # Rediriger vers la page d'accueil après une connexion réussie
LOGOUT_REDIRECT_URL = 'index' # Rediriger vers la page d'accueil après la déconnexion
Créer des gabarits liés à l'authentification
Gabarit de connexion
Exemple
{% extends 'blog/base.html' %}
{% block title %}Connexion - EXAMPLE Blog{% endblock %}
{% block content %}
<div class="auth-form">
<h2>Se connecter</h2>
<form method="post">
{% csrf_token %}
<div class="form-group">
<label>Nom d'utilisateur</label>
{{ form.username }}
</div>
<div class="form-group">
<label>Mot de passe</label>
{{ form.password }}
</div>
{% if form.errors %}
<p class="error-msg">Nom d'utilisateur ou mot de passe incorrect, veuillez réessayer.</p>
{% endif %}
<button type="submit" class="btn-submit">Se connecter</button>
</forme>
<p class="form-footer">
Pas encore de compte ?<a href="{% url 'register' %}">Inscrivez-vous maintenant</a>
</p>
</div>
{% endblock %}
Gabarit d'inscription
Exemple
{% extends 'blog/base.html' %}
{% block title %}Inscription - EXAMPLE Blog{% endblock %}
{% block content %}
<div class="auth-form">
<h2>Registre</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn-submit">S'inscrire</button>
</forme>
<p class="form-footer">
Vous avez déjà un compte ?<a href="{% url 'login' %}">Connectez-vous maintenant</a>
</p>
</div>
{% endblock %}
{% csrf_token %}Ceci est le mécanisme de sécurité de Django pour prévenir les attaques par falsification de requête intersite (CSRF). Tout formulaire POST doit l'inclure, sinon Django rejettera la requête (erreur 403). Cette balise génère un champ de saisie masqué contenant un jeton CSRF aléatoire.
Afficher l'état de connexion dans la barre de navigation
Mettre à jour la barre de navigation dans base.html pour afficher un contenu différent selon l'état de connexion.
Exemple
<header class="navbar">
<a href="/" class="logo">EXAMPLE Blog</a>
<nav>
<a href="/">Accueil</a>
{% if user.is_authenticated %}
{# Connecté : afficher le nom d'utilisateur et le bouton de déconnexion (l'utilisateur est automatiquement injecté par Django) #}
<span class="user-name">{{ user.username }}</span>
<a href="{% url 'logout' %}">Déconnexion</a>
{% else %}
{# Non connecté : afficher les liens de connexion et d'inscription #}
<a href="{% url 'login' %}">Connexion</a>
<a href="{% url 'register' %}">Inscription</a>
{% endif %}
</nav>
</header>
Le processeur de contexte de template de Django va automatiquement
{{ user }}l'injecter dans chaque template sans avoir besoin de le passer manuellement dans views.py. Vous pouvez utiliseruser.is_authenticatedDéterminez si l'utilisateur est connecté.
Style de la page de connexion
Exemple
.auth-form {
max-width: 400px;
margin: 40px auto;
padding: 30px;
background: #fff;
border-radius: 12px;
box-shadow: 0 2px 12px rgba(0,0,0,0.08);
}
.auth-form h2 {
margin-bottom: 24px;
text-align: center;
}
.auth-form .form-group {
margin-bottom: 16px;
}
.auth-form label {
display: block;
margin-bottom: 6px;
font-weight: 500;
}
.auth-form input {
width: 100%;
padding: 10px 12px;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 14px;
}
.btn-submit {
width: 100%;
padding: 12px;
background: #2c3e50;
color: #fff;
border: none;
border-radius: 6px;
font-size: 16px;
cursor: pointer;
margin-top: 10px;
}
.error-msg {
color: #e74c3c;
font-size: 14px;
}
.form-footer {
margin-top: 16px;
text-align: center;
font-size: 14px;
}
.user-name {
color: #2c3e50;
font-weight: 500;
}
Résumé du chapitre
Dans ce chapitre, vous avez intégré le système d'authentification intégré de Django : vous avez hérité de UserCreationForm pour créer le formulaire d'inscription, utilisé LoginView/LogoutView pour implémenter la connexion/déconnexion, utilisé csrf_token pour protéger les requêtes POST, et utilisé user.is_authenticated dans les gabarits pour vérifier l'état de connexion.
Maintenant, le blog dispose d'un flux complet d'inscription, de connexion et de déconnexion des utilisateurs.
autres extensions