1 异常处理 Exceptions

REST framework提供了异常处理,我们可以自定义异常处理函数。

1.1 使用方式

  1. from rest_framework.views import exception_handler
  2. from rest_framework.response import Response
  3. from rest_framework import status
  4. def all_exception_handler(exc, context):
  5. response = exception_handler(exc, context)
  6. if not response:
  7. return Response(status=status.HTTP_400_BAD_REQUEST, data={'status': 999, 'msg': str(exc)})
  8. else:
  9. return Response(status=status.HTTP_400_BAD_REQUEST, data={'status': 666, 'msg': response.data.get('detail')})

在配置文件中声明自定义的异常处理

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'my_project.my_app.utils.all_exception_handler'
}

如果未声明,会采用默认的方式,如下
rest_frame/settings.py

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler'
}

1.2 案例

处理关于数据库的异常

from rest_framework.views import exception_handler
from rest_framework.response import Response
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework import status
from django.db import DatabaseError

def exception_handler(exc, context):
    response = drf_exception_handler(exc, context)

    if response is None:
        view = context['view']
        print('[%s]: %s' % (view, exc))
        if isinstance(exc, DatabaseError):
            response = Response({'detail': '服务器内部错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
        else:
            response = Response({'detail': '未知错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

    return response

# 在setting.py中配置
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.ser.exception_handler'
}

1.3 REST framework定义的异常

  • APIException 所有异常的父类
  • ParseError 解析错误
  • AuthenticationFailed 认证失败
  • NotAuthenticated 尚未认证
  • PermissionDenied 权限决绝
  • NotFound 未找到
  • MethodNotAllowed 请求方式不支持
  • NotAcceptable 要获取的数据格式不支持
  • Throttled 超过限流次数
  • ValidationError 校验失败

也就是说,很多的没有在上面列出来的异常,就需要我们在自定义异常中自己处理了。