logo oujood
🔍

Gestion des erreurs dans Django

Toute application web rencontre des erreurs : page introuvable, serveur en panne, accès refusé. Django fournit des mécanismes précis pour les intercepter proprement, afficher des messages utiles aux utilisateurs et protéger les informations sensibles en production.

OUJOOD.COM

Le mode DEBUG et ses implications

Dans settings.py, le paramètre DEBUG contrôle le comportement de Django face aux erreurs. En développement il vaut True — Django affiche une page de débogage détaillée avec la traceback complète, les variables locales et la configuration. En production il doit impérativement être à False : ces informations révèlent la structure interne de votre application aux visiteurs.

  📋 Copier le code

# settings.py
DEBUG = True   # Développement — page de débogage détaillée
DEBUG = False  # Production — pages d'erreur personnalisées

# En production, ALLOWED_HOSTS est obligatoire quand DEBUG = False
ALLOWED_HOSTS = ['monsite.com', 'www.monsite.com']

Attention : avec DEBUG = False et ALLOWED_HOSTS vide, Django refuse toutes les requêtes. Vous devez y lister les domaines autorisés à accéder à votre application.

Lever une erreur 404 manuellement

Quand une vue ne trouve pas la ressource demandée, elle doit retourner une erreur 404 plutôt qu'une page vide ou une erreur Python. Django fournit l'exception Http404 pour ça :

  📋 Copier le code

from django.http import Http404
from .models import Membres

def detail(request, id):
    try:
        membre = Membres.objects.get(id=id)
    except Membres.DoesNotExist:
        # Lève une 404 au lieu de planter avec une erreur 500
        raise Http404("Membre introuvable")
    return render(request, 'detail.html', {'membre': membre})

get_object_or_404 — le raccourci standard

Le pattern try/except ci-dessus est tellement courant que Django fournit un raccourci : get_object_or_404() fait exactement la même chose en une ligne.

  📋 Copier le code

from django.shortcuts import get_object_or_404, render
from .models import Membres

def detail(request, id):
    # Retourne le membre ou lève automatiquement Http404
    membre = get_object_or_404(Membres, id=id)
    return render(request, 'detail.html', {'membre': membre})

La fonction accepte les mêmes arguments que filter() — vous pouvez filtrer sur n'importe quel champ :

  📋 Copier le code

# 404 si le membre n'existe pas ou si son compte est inactif
membre = get_object_or_404(Membres, id=id, actif=True)

# Fonctionne aussi avec get_list_or_404 (404 si la liste est vide)
from django.shortcuts import get_list_or_404
membres = get_list_or_404(Membres, nom='Dubois')

Personnaliser les pages d'erreur

Quand DEBUG = False, Django affiche ses pages d'erreur par défaut — fonctionnelles mais génériques. Pour les remplacer par vos propres templates, créez les fichiers suivants dans un dossier templates/ accessible par Django :

  📋 Copier le code

templates/
    404.html   # Page introuvable
    500.html   # Erreur serveur interne
    403.html   # Accès refusé
    400.html   # Requête invalide

Django les trouve automatiquement à condition que le dossier templates/ soit déclaré dans DIRS de la configuration TEMPLATES dans settings.py :

  📋 Copier le code

# settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],  # Dossier templates à la racine
        'APP_DIRS': True,
        ...
    },
]

Exemple de page 404 personnalisée

  📋 Copier le code

<!DOCTYPE html>
<html>
<head>
    <title>Page introuvable — 404</title>
</head>
<body>
    <h1>Page introuvable</h1>
    <p>La page que vous cherchez n'existe pas ou a été déplacée.</p>
    <a href="/">Retour à l'accueil</a>
</body>
</html>

Remarque : les templates d'erreur ne sont utilisés que si DEBUG = False. En développement, Django affiche toujours sa page de débogage détaillée, quelle que soit l'existence de vos templates d'erreur.

Gérer les erreurs 403 — accès refusé

Une erreur 403 survient quand un utilisateur tente d'accéder à une ressource sans les permissions nécessaires. Django lève automatiquement cette erreur quand vous utilisez les décorateurs de permission, mais vous pouvez aussi la lever manuellement :

  📋 Copier le code

from django.core.exceptions import PermissionDenied

def vue_admin(request):
    if not request.user.is_staff:
        # Lève une 403 si l'utilisateur n'est pas membre du staff
        raise PermissionDenied
    return render(request, 'admin_panel.html')

Par carabde | Mis à jour le 05 mai 2025