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

# Chemin du fichier : blog/forms.py (nouveau fichier)
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

# Chemin du fichier: blog/views.py (nouvellement ajouté)
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 DjangomessagesCe 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

# Chemin du fichier : blog/urls.py
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

# Chemin du fichier : à ajouter à la fin de blog_project/settings.py
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

<!-- Chemin du fichier : blog/templates/blog/login.html -->
{% 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

<!-- Chemin du fichier : blog/templates/blog/register.html -->
{% 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

<!-- Modifier la section de la barre de navigation de blog/templates/blog/base.html -->
<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

/* Ajouter au style dans base.html */
.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