【一】前言
# 1 集成了APIView及子类的视图类 -在执行:三大认证 -在执行:过滤 -在执行:分页 -在执行:视图类的方法 过程中,只要出了异常,都会被异常捕获,统一执行一个【函数】exception_handler from rest_framework.response import Response def common_exception_handler(exc, context): print(exc) print(context) l = [1, 2, 3] print(l[6]) # python程序异常 raise Exception("出错了") # django的异常 return Response({'code': '303', 'msg': '服务器异常'})
异常:3大类: # 1 drf的异常:APIException,ValidationError,AuthenticationFailed-->默认exception_handler会处理,前端捕获抛错了 # 2 django的异常:exception_handler不会处理,前端会抛出错误 # 3 python程序的异常:主动抛raise,除以0,列表越界,exception_handler不会处理,前端会抛出错误
-
我们要做的就是统一自己写一个函数来处理这三种异常
# settings.py 1 写个方法 2 配置在配置文件中 3 有在再出了异常,就会走自己写的 函数 # 自定义异常函数的目的就是 # 1 统一返回格式 # 2 返回自己定制的日志记录 REST_FRAMEWORK={ 'EXCEPTION_HANDLER': 'app01.exceptions.common_exception_handler', }
import time from rest_framework.views import exception_handler from rest_framework.response import Response def common_exception_handler(exc, context): request = context.get('request') view = context.get('view') print( f'报错时间:{time.time()},用户:{request.user.username or "匿名用户"},访问地址:{request.get_full_path()},请求方式:{request.method},视图类:{str(view)}') response = exception_handler(exc, context) # 有值,说明是drf的异常 if response: if isinstance(response.data, dict): msg = response.data.get("detail") or "未知错误" elif isinstance(response.data, list): msg = response.data[0] return Response({'code': 303, 'msg': f'drf异常,异常信息:{msg}'}) else: return Response({'code': 304, 'msg': f'程序异常,异常信息:{str(exc)}'})