69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
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
|