自定义全局异常
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',
}