DRF 异常处理
异常处理
- Exceptions
settings.py
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'my_project.my_app.utils.common_exception_handler'
}
自定义异常处理函数
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') # 哪个视图类出的错
view_name =view.__class__.__name__
print(f'请求方式是:{request.method},请求地址是:{request.get_full_path()},客户端ip:{request.META.get("REMOTE_ADDR")},用户id:{user_id}')
response = exception_handler(exc, context)
if response:
if isinstance(response.data,list):
err=response.data[0]
elif isinstance(response.data, dict):
err = response.data.get('detail', '{view_name}视图出错了,错误信息:系统错误,请联系系统管理员')
else:
err='系统错误,请联系系统管理员'
return Response({'code':901,'msg': f'{view_name}视图出错了,drf的异常:{err}'})
else:
if isinstance(exc,ZeroDivisionError):
return Response({'code':950,'msg': f'{view_name}视图出错了,错误信息:不能除以0'})
elif isinstance(exc, TypeError):
return Response({'code':951,'msg': f'{view_name}视图出错了,错误信息:类型错误,不同类型不能操作'})
elif isinstance(exc, KeyError):
return Response({'code': 952, 'msg': f'{view_name}视图出错了,错误信息:字典键错误,不存在键'})
elif isinstance(exc, ValueError):
return Response({'code': 953, 'msg': f'{view_name}视图出错了,错误信息:值错误,类型不对'})
elif isinstance(exc, NameError):
return Response({'code': 954, 'msg': f'{view_name}视图出错了,错误信息:变量名错误,变量未被定义'})
elif isinstance(exc, IndexError):
return Response({'code': 956, 'msg': f'{view_name}视图出错了,错误信息:索引错误,超出范围'})
else:
return Response({'code': 957, 'msg': f'{view_name}视图出错了,错误信息:其他错误'})
REST framework定义的异常
- APIException 所有异常的父类
- ParseError 解析错误
- AuthenticationFailed 认证失败
- NotAuthenticated 尚未认证
- PermissionDenied 权限决绝
- NotFound 未找到
- MethodNotAllowed 请求方式不支持
- NotAcceptable 要获取的数据格式不支持
- Throttled 超过限流次数
- ValidationError 校验失败