1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- # -*- coding: utf-8 -*-
- """
- @author: Allen
- @Created on: 2023/10/18
- @Remark: 自定义异常处理
- """
- import logging
- import traceback
- from django.db.models import ProtectedError, RestrictedError
- from django.http import Http404
- from rest_framework.exceptions import APIException as DRFAPIException, AuthenticationFailed, PermissionDenied
- from rest_framework.status import HTTP_407_PROXY_AUTHENTICATION_REQUIRED, HTTP_401_UNAUTHORIZED
- from rest_framework.views import set_rollback, exception_handler
- from dvadmin.utils.json_response import ErrorResponse
- logger = logging.getLogger(__name__)
- def CustomExceptionHandler(ex, context):
- """
- 统一异常拦截处理
- 目的:(1)取消所有的500异常响应,统一响应为标准错误返回
- (2)准确显示错误信息
- :param ex:
- :param context:
- :return:
- """
- msg = ""
- code = 4000
- # 调用默认的异常处理函数
- response = exception_handler(ex, context)
- if isinstance(ex, AuthenticationFailed):
- # 如果是身份验证错误
- if response and response.data.get("detail") == "Given token not valid for any token type":
- code = 401
- msg = ex.detail
- elif response and response.data.get("detail") == "Token is blacklisted":
- # token在黑名单
- return ErrorResponse(status=HTTP_401_UNAUTHORIZED)
- else:
- code = 401
- msg = ex.detail
- elif isinstance(ex, Http404):
- code = 400
- msg = "接口地址不正确"
- elif isinstance(ex, DRFAPIException):
- set_rollback()
- msg = ex.detail
- if isinstance(ex, PermissionDenied):
- msg = f'{msg} ({context["request"].method}: {context["request"].path})'
- if isinstance(msg, dict):
- for k, v in msg.items():
- for i in v:
- msg = "%s:%s" % (k, i)
- elif isinstance(ex, (ProtectedError, RestrictedError)):
- set_rollback()
- msg = "无法删除:该条数据与其他数据有相关绑定"
- # elif isinstance(ex, DatabaseError):
- # set_rollback()
- # msg = "接口服务器异常,请联系管理员"
- elif isinstance(ex, Exception):
- logger.exception(traceback.format_exc())
- msg = str(ex)
- return ErrorResponse(msg=msg, code=code)
|