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 校验失败
posted @ 2024-04-22 16:40  蓝幻ﹺ  阅读(9)  评论(0编辑  收藏  举报