57 lines
2.3 KiB
Python
57 lines
2.3 KiB
Python
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
|