django-vue-admin/dvadmin-backend/apps/vadmin/utils/exceptions.py

84 lines
2.1 KiB
Python
Raw Normal View History

2021-02-21 17:08:48 +00:00
import logging
import traceback
2021-03-23 15:14:13 +00:00
from rest_framework import exceptions
2021-03-20 07:47:16 +00:00
from rest_framework.views import set_rollback
2021-03-21 03:24:50 +00:00
from .request_util import get_verbose_name
2021-02-24 13:37:46 +00:00
from .response import ErrorResponse
2021-02-21 17:08:48 +00:00
logger = logging.getLogger(__name__)
from rest_framework.exceptions import APIException as DRFAPIException, AuthenticationFailed
2021-02-21 17:08:48 +00:00
class APIException(Exception):
"""
通用异常:(1)用于接口请求是抛出移除, 此时code会被当做标准返回的code, message会被当做标准返回的msg
"""
def __init__(self, code=201, message='API异常', args=('API异常',)):
2021-03-23 15:14:13 +00:00
self.args = args
self.code = code
self.message = message
2021-02-21 17:08:48 +00:00
def __str__(self):
return self.message
class GenException(APIException):
pass
class FrameworkException(Exception):
"""
框架异常配置异常等
"""
def __init__(self, message='框架异常', *args: object, **kwargs: object) -> None:
2021-03-23 15:14:13 +00:00
super().__init__(*args, )
self.message = message
2021-02-21 17:08:48 +00:00
def __str__(self) -> str:
return f"{self.message}"
class JWTAuthenticationFailedException(APIException):
"""
JWT认证异常
"""
def __init__(self, code=201, message=None, args=('异常',)):
if not message:
message = 'JWT authentication failed!'
super().__init__(code, message, args)
def op_exception_handler(ex, context):
"""
统一异常拦截处理
目的:(1)取消所有的500异常响应,统一响应为标准错误返回
(2)准确显示错误信息
:param ex:
:param context:
:return:
"""
msg = ''
code = '201'
2021-03-21 03:24:50 +00:00
request = context.get('request')
2021-03-23 15:14:13 +00:00
request.session['model_name'] = str(get_verbose_name(view=context.get('view')))
2021-03-21 03:24:50 +00:00
if isinstance(ex, AuthenticationFailed):
code = 401
msg = ex.detail
elif isinstance(ex, DRFAPIException):
2021-03-20 07:47:16 +00:00
set_rollback()
2021-02-21 17:08:48 +00:00
msg = ex.detail
elif isinstance(ex, exceptions.APIException):
2021-03-20 07:47:16 +00:00
set_rollback()
msg = ex.detail
2021-02-21 17:08:48 +00:00
elif isinstance(ex, Exception):
logger.error(traceback.format_exc())
msg = str(ex)
2021-03-23 15:14:13 +00:00
return ErrorResponse(msg=msg, code=code)