drf : 异常处理以及自定义异常处理
异常处理
在APIView的源码中,执行三大认证,视图类方法的时候,如果出现了异常,会被全局异常捕获。
我们想要做的事将报错信息展示为自定义的错误信息。
eg:
报错:
{code:999,msg:服务器异常,请联系系统管理员}
成功:
{code:100,msg:成功,data:[{},{}...]}
自定义APIException,此时我们自定义异常,那么异常捕获会优先使用自定义。
settings.py,配置文件配置之后才会使用自定义的异常捕获
REST_FRAMEWORK = {
'EXCEPTION_HANDLER':'app01.errors.comment_exception_handler'
}
查看from rest_framework.views import exception_handler
源码。
APIException异常的状态码为500,被自定义异常捕获。
主动排除程序异常
最终想要呈现的效果:
from rest_framework.views import exception_handler
from rest_framework.response import Response
"""
在内置的settings.py 如果没有自定义使用内置的异常捕获。
'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
"""
def comment_exception_handler(exc, context):
"""
{
'view': <app01.views.TextAPIView object at 0x7fba5bde2c18>,
'args': (),
'kwargs': {},
'request': <rest_framework.request.Request: GET '/text/'>
}
"""
print(context)
res = exception_handler(exc, context)
"""
第一种情况:返回Response对象,
这表示已经处理了异常,并且只处理APIException的异常
"""
if res:
res = Response(data={
'code':998,
'status':res.status_code,
'msg':res.data.get('detail','服务器异常,联系系统管理员')
})
else:
return Response({'code': 999, 'msg': str(exc)})
request = context.get('request')
view = context.get('view')
print(f'错误原因: {str(request)}',f'错误视图类: {str(view)}',f'请求方式:{str(request.method)}',f'请求路径:{request.path}')
return res
输出:
错误原因: <rest_framework.request.Request: GET '/text/'> 错误视图类: <app01.views.TextAPIView object at 0x7fedde3cdb38> 请求地址:GET 请求路径:/text/