import traceback from django.core.exceptions import PermissionDenied from django.http import Http404 from rest_framework import exceptions from rest_framework.views import set_rollback import logging from utils.response import ApiResponse logger = logging.getLogger('log') def custom_exception(exc, context): if isinstance(exc, Http404): exc = exceptions.NotFound() elif isinstance(exc, PermissionDenied): exc = exceptions.PermissionDenied() message = "服务器内部错误" headers = {} code = 400 if isinstance(exc, exceptions.APIException): code = exc.status_code if getattr(exc, 'auth_header', None): headers['WWW-Authenticate'] = exc.auth_header if getattr(exc, 'wait', None): headers['Retry-After'] = '%d' % exc.wait if isinstance(exc.detail, dict): try: if hasattr(exc.detail.serializer, 'Meta'): model = exc.detail.serializer.Meta.model message = '' for field, e in exc.detail.items(): if hasattr(model, field): verbose_name = model._meta.get_field(field).verbose_name # message += verbose_name + ','.join(e) + ',' message += verbose_name for error in e: if isinstance(error, str): message += f',{error}' if isinstance(error, dict): values = error.values() for value in values: if isinstance(value, list): message += ',' + ','.join(value) else: message += f',{value}' else: message += ','.join(e) + ',' else: message = exc.detail except Exception: message = exc.detail else: message = exc.detail set_rollback() try: logger.error(traceback.format_exc()) return ApiResponse(code=code, message=str(message), status=200, headers=headers) except Exception: logger.error(traceback.format_exc()) return ApiResponse(code=code, message=str(message), status=200, headers=headers) class CustomProjectException(exceptions.APIException): pass