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.
# 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 :
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.
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 :
# 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 :
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 :
# 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
<!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 :
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