Gestion des erreurs (Django)
Dans Django, la gestion des erreurs consiste à détecter, intercepter et traiter les exceptions qui surviennent lors du traitement d’une requête, afin de renvoyer au client une réponse claire, adaptée et sécurisée.
Elle permet d’éviter que l’utilisateur voie des messages d’erreurs internes non maîtrisés, tout en garantissant que le serveur continue de fonctionner normalement.
Django intègre un système de gestion d’exceptions robuste qui fonctionne à la fois pour les vues classiques et les APIs (avec Django REST Framework).
Comment ça fonctionne dans Django
Déclencher une erreur
-
Lever une exception Django native comme :
-
Http404
pour signaler qu’une ressource n’existe pas. -
PermissionDenied
pour un accès interdit.
-
-
Utiliser les vues utilitaires comme
get_object_or_404()
pour simplifier ce comportement.
Intercepter les erreurs globalement
-
Configurer des gestionnaires d’erreurs dans
urls.py
:-
handler400
: Mauvaise requête -
handler403
: Accès interdit -
handler404
: Page non trouvée -
handler500
: Erreur interne
-
-
Chaque gestionnaire est une vue qui retourne une réponse HTML ou JSON.
Gestion des erreurs avec Django REST Framework (DRF)
-
DRF remplace la réponse HTML par une réponse JSON par défaut pour les API.
-
On peut définir un gestionnaire d’exceptions personnalisé via
REST_FRAMEWORK['EXCEPTION_HANDLER']
danssettings.py
. -
Ce gestionnaire reçoit l’exception et le contexte, et doit renvoyer une réponse formatée (souvent
{ "error": "Message d’erreur" }
).
Codes HTTP courants
-
400 : Mauvaise requête
-
401 : Non authentifié (avec DRF et permissions)
-
403 : Accès interdit
-
404 : Ressource non trouvée
-
500 : Erreur interne du serveur
Exemple conceptuel
-
URL / endpoint :
/articles/<id>/
-
Comportement : si l’article demandé n’existe pas, lever
Http404
. -
Réponse :
-
En HTML (site web) : page “404 Not Found” personnalisée.
-
En JSON (API DRF) :
{ "error": "Article not found" }
avec code 404.
-
Bonnes pratiques
-
Utiliser les exceptions Django natives (
Http404
,PermissionDenied
) plutôt que de créer des erreurs génériques. -
Personnaliser les pages d’erreurs HTML dans des templates (
404.html
,500.html
, etc.). -
Uniformiser les réponses JSON d’erreur pour les APIs via un gestionnaire DRF personnalisé.
-
Ne jamais exposer la stack trace en production (
DEBUG = False
). -
Consigner les erreurs critiques avec le module
logging
pour analyse.
Pourquoi c’est important
-
Améliore l’expérience utilisateur en présentant des messages clairs et adaptés.
-
Évite d’exposer des informations sensibles du serveur.
-
Permet aux API clientes de traiter correctement les erreurs.
-
Facilite la maintenance et le débogage grâce à des logs structurés.
En résumé
-
Django gère les erreurs via ses exceptions natives et ses gestionnaires globaux.
-
Pour un site web, on privilégie des pages HTML personnalisées.
-
Pour une API, on renvoie des réponses JSON cohérentes via Django REST Framework.
-
La gestion des erreurs est essentielle pour la sécurité, la fiabilité et la qualité de l’application.
Fonctions :
-
Gestion des erreurs avec Django (exemple)