DRF的异常处理
默认情况下,DRF框架通过内置的 exception_handler
方法,处理了如下异常:
- django内置异常
- Http404
- PermissionDenied
DRF框架异常
- APIException - DRF 框架异常的父类,以下为它的子类
- NotFound 未找到
- PermissionDenied 权限拒绝
- ParseError 解析错误
- AuthenticationFailed 认证失败
- NotAuthenticated 尚未认证
- MethodNotAllowed 请求方式不支持
- Throttled 超过限流次数
- ValidationError 校验失败
- NotAcceptable 要获取的数据格式不支持
如果
exception_handler
方法处理异常成功,则返回一个Response对象,否则返回None
如果发生了上面的这些异常,DRF框架的excaption_handler函数可以自动捕获异常,然后进行处理,返回Response对象。如果不是上面的这些异常,则处理不了,返回None。
那我们在生产环境中,需要把全部异常捕获,输入到日志中。而且我们也不希望给错误页面给用户看到,这时候应该怎么办呢?
这时候可以针对 DRF 框架没有处理的一些特殊的异常,进行全局的异常处理。
示例:
from rest_framework.response import Response from rest_framework.views import exception_handler def custom_exception_handler(exc, context): # 先调用DRF默认的 exception_handler 方法, 对异常进行处理, # 如果处理成功,会返回一个`Response`类型的对象 response = exception_handler(exc, context) if response is None: # 项目出错了,但DRF框架对出错的异常没有处理, # 可以在此处对异常进行统一处理,比如:保存出错信息到日志文件 view = context['view'] # 出错的视图 error = '服务器内部错误, %s' % exc print('%s: %s' % (view, error)) return Response({'detail': error}, status=500) return response
最后还需要在配置文件中声明自定义的异常处理
REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'DjangoREST.exceptions.custom_exception_handler' }
这时候如果有其他异常出现,就可以捕获并且处理啦,也能返回Response对象。
代码成就万世基积沙镇海,梦想永在凌云意意气风发。