DRF(十三):处理全局异常

自定义全局异常

DRF默认的异常处理,只处理APIException及其子类的异常,处理不了的会返回None,我们可以判断异常是否属于APIException及其子类的异常,如果是则返回错误信息,如果不是,那么我们则返回服务器错误。

# 默认的异常处理,缺陷在它只处理APIException及其子类的异常,处理不了的会返回None
from rest_framework.views import exception_handler

from rest_framework.response import Response


def common_exception_handler(exc, context):

    ### 记录日志,目前先打印
    user_id = context['request'].user.id
    print('视图类:%s 出错了,是IP地址为%s的用户访问,用户id为:%s,错误原因是%s'
          % (
              str(context['view']),
              context['request'].META.get('REMOTE_ADDR'),
              user_id,
              str(exc)
          ))
    # 处理异常,统一返回格式
    response = exception_handler(exc, context)

    if response:  # 有值
        return Response(data={'code': 9998, 'msg': response.data})
    else:  # 没有值
        # exc对象,就是错误对象,把错误信息要记录日志
        return Response(data={'code': 9999, 'msg': '服务器异常,请联系系统管理员'})
    
# 2 在配置文件中配置
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.exceptions.common_exception_handler', 
}

exc中是错误原因,context中包括视图类和请求数据

# 打印exc得到错误原因
list index out of range 
# 打印context得到
view是视图类,request请求信息,里面可以得到用户id和ip地址
{'view': <app01.views.IndexView object at 0x0000022B36C91610>, 'args': (), 'kwargs': {}, 'request': <rest_framework.request.Request: GET '/'>}

处理全局异常格式:

#1  定义一个函数
def common_exception_handler(exc, context):
    # 加入日志的逻辑
    response = exception_handler(exc, context)
    if response:
        return Response(data={'code': 9998, 'msg': response.data})
    else:
        return Response(data={'code': 9999, 'msg': '服务器异常,请联系系统管理员'})
    
 # 2 在配置文件中配置
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.exceptions.common_exception_handler', 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值