EduLab / backend /apps /core /exceptions.py
rinogeek's picture
first commit
fafd0bb
"""
Custom exception handler for Django REST Framework
Développé par Marino ATOHOUN pour Hypee
"""
from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework import status
def custom_exception_handler(exc, context):
"""
Gestionnaire d'exceptions personnalisé pour DRF
Ajoute des informations supplémentaires aux réponses d'erreur
et standardise le format de retour.
"""
# Appeler le gestionnaire par défaut de DRF
response = exception_handler(exc, context)
if response is not None:
# Standardiser le format de réponse d'erreur
custom_response_data = {
'error': True,
'status_code': response.status_code,
'message': None,
'details': response.data
}
# Essayer d'extraire un message clair
if isinstance(response.data, dict):
if 'detail' in response.data:
custom_response_data['message'] = response.data['detail']
elif 'non_field_errors' in response.data:
custom_response_data['message'] = response.data['non_field_errors'][0]
else:
# Prendre le premier message d'erreur trouvé
for field, errors in response.data.items():
if isinstance(errors, list) and errors:
custom_response_data['message'] = f"{field}: {errors[0]}"
break
# Message par défaut selon le code de statut
if not custom_response_data['message']:
if response.status_code == 400:
custom_response_data['message'] = "Données invalides"
elif response.status_code == 401:
custom_response_data['message'] = "Authentification requise"
elif response.status_code == 403:
custom_response_data['message'] = "Accès refusé"
elif response.status_code == 404:
custom_response_data['message'] = "Ressource non trouvée"
elif response.status_code == 500:
custom_response_data['message'] = "Erreur serveur interne"
else:
custom_response_data['message'] = "Une erreur est survenue"
response.data = custom_response_data
return response