factory/apps/utils/exceptions.py

53 lines
1.8 KiB
Python
Executable File

import traceback
from django.core.exceptions import PermissionDenied
from django.http import Http404
import logging
from rest_framework import exceptions
from rest_framework.response import Response
from rest_framework.views import set_rollback
import json
# 实例化myLogger
myLogger = logging.getLogger('log')
def custom_exception_hander(exc, context):
"""
自定义异常处理
"""
if isinstance(exc, Http404):
exc = exceptions.NotFound()
elif isinstance(exc, PermissionDenied):
exc = exceptions.PermissionDenied()
request_id = getattr(context['request'], 'request_id', None)
if isinstance(exc, exceptions.APIException):
headers = {}
if getattr(exc, 'auth_header', None):
headers['WWW-Authenticate'] = exc.auth_header
if getattr(exc, 'wait', None):
headers['Retry-After'] = '%d' % exc.wait
data = {'err_detail': exc.detail}
if isinstance(exc.detail, dict):
data['err_code'] = exc.default_code
data['err_msg'] = json.dumps(exc.detail, ensure_ascii=False) # 取一部分方便前端alert
elif isinstance(exc.detail, list):
data['err_code'] = exc.default_code
data['err_msg'] = json.dumps(exc.detail, ensure_ascii=False)
else:
data = {'err_msg': exc.detail, 'err_code': exc.get_codes()}
set_rollback()
data['request_id'] = request_id
status = exc.status_code
if status not in [401, 404]:
status = 400
return Response(data, status=status, headers=headers)
args = (request_id, traceback.format_exc())
myLogger.error(f"{args[0]}-{args[1]}")
return Response(data={'err_code': 'server_error',
'err_detail': '',
'err_msg': '服务器错误', 'request_id': request_id}, status=500)