initiate drf app
This commit is contained in:
56
backend/api/utils/decorators.py
Normal file
56
backend/api/utils/decorators.py
Normal file
@@ -0,0 +1,56 @@
|
||||
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
|
||||
Reference in New Issue
Block a user