yzk_wechat_event/utils/exceptions.py

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