from functools import wraps from rest_framework.response import Response from rest_framework import status from django.core.exceptions import ValidationError, PermissionDenied from django.http import Http404 from rest_framework.exceptions import APIException def handle_exceptions(func): """ Обработчик ошибок для API endpoints Обрабатывает различные типы исключений и возвращает соответствующие HTTP статусы Текущие обрабоки: - Ошибки валидации - HTTP400 - Объект не найден - HTTP404 - Ошибки доступа - HTTP403 - Обработки DRF исключений - вернется статус код от DRF - Необработанные исключения - HTTP500 """ @wraps(func) def wrapper(*args, **kwargs): try: return func(*args, **kwargs) except ValidationError as e: # ошибки валидации return Response( {"error": e.messages if hasattr(e, 'messages') else str(e)}, status=status.HTTP_400_BAD_REQUEST ) except Http404 as e: # объект не найден return Response( {"error": str(e) or "Запрашиваемый ресурс не найден"}, status=status.HTTP_404_NOT_FOUND ) except PermissionDenied as e: # ошибки доступа return Response( {"error": str(e) or "У вас нет прав для выполнения этого действия"}, status=status.HTTP_403_FORBIDDEN ) except APIException as e: # обработка DRF исключений return Response( {"error": str(e)}, status=e.status_code ) except Exception as e: # необработанные исключения return Response( { "error": "Произошла внутренняя ошибка сервера", "detail": str(e) }, status=status.HTTP_500_INTERNAL_SERVER_ERROR ) return wrapper