""" Кастомный обработчик исключений для DRF. """ from rest_framework.views import exception_handler from rest_framework.response import Response from rest_framework import status def custom_exception_handler(exc, context): """ Кастомный обработчик исключений. Возвращает ответ в унифицированном формате. """ # Получаем стандартный response response = exception_handler(exc, context) if response is not None: # Если у исключения есть detail_dict (для PermissionDenied с дополнительными данными) if hasattr(exc, 'detail_dict') and isinstance(exc.detail_dict, dict): # Используем detail_dict вместо стандартного response.data response.data = exc.detail_dict # Форматируем ответ в унифицированный формат custom_response_data = { 'success': False, 'error': { 'code': response.status_code, 'message': get_error_message(response.data), 'details': response.data } } response.data = custom_response_data return response def get_error_message(data): """ Извлекает главное сообщение об ошибке из данных ответа. """ if isinstance(data, dict): # Если есть 'detail', возвращаем его if 'detail' in data: return str(data['detail']) # Иначе возвращаем первое значение for key, value in data.items(): if isinstance(value, list) and value: return f"{key}: {value[0]}" return f"{key}: {value}" elif isinstance(data, list) and data: return str(data[0]) return 'Произошла ошибка'