RESTframework定义的异常
一、定义异常处理类
二、注册DRF框架中默认的错误处理为自己定义的类
总结
REST framework定义的异常APIException
所有异常的父类
ParseError
解析错误
AuthenticationFailed
认证失败
NotAuthenticated
尚未认证
PermissionDenied
权限决绝
NotFound
未找到
MethodNotAllowed
请求方式不支持
NotAcceptable
要获取的数据格式不支持
Throttled
超过限流次数
ValidationError
校验失败
from django.http import JsonResponse
from rest_framework.views import exception_handler as drf_exception_handler
import logging
from django.db import DatabaseError
from redis.exceptions import RedisError
import traceback
# 获取在配置文件中定义的logger,用来记录日志
logger = logging.getLogger('django')
def exception_handler(exc, context):
"""
自定义异常处理
:param exc: 异常
:param context: 抛出异常的上下文(包含request请求对象和view视图对象)
:return: Response响应对象
"""
# 调用drf框架原生的异常处理方法
response = drf_exception_handler(exc, context)
if response is not None:
logger.info('REST_FRAMEWORK处理异常')
# 使用自定义封装好的方法处理数据格式并返回给前端
return response_util.success(response)
view = context['view']
# 打印异常类以及异常的文本信息
logger.error('[%s] %s' % (view, exc))
returnData = {
'code': 500,
'msg': '服务器错误',
'data': ""
}
# 捕获其他异常,直接返回 500
if isinstance(exc, DatabaseError) or isinstance(exc, RedisError):
# 数据库异常,使用traceback.format_exc()可以像系统报错没拦截那样子打印详细错误信息又不会导致程序停止
logger.error(f'其他未知错误:{traceback.format_exc()}')
# 使用django原生的响应对象返回,不能用DRF框架的响应对象
return JsonResponse(data=returnData, status=500)
else:
# 打印错误详细信息
logger.error(f'其他未知错误:{traceback.format_exc()}')
# 使用django原生的响应对象返回,不能用DRF框架的响应对象
return JsonResponse(data=returnData, status=500)
二、注册DRF框架中默认的错误处理为自己定义的类
在settings.py文件中定义
REST_FRAMEWORK = {
# 异常处理
'EXCEPTION_HANDLER': 'meiduo_service.utils.excepitons.exception_handler',
}
修改django默认处理了错误对象类似,将错误处理对象改为用中间件即可,处理的逻辑思路一样,不过类以及设置方法不一样而已
总结本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注软件开发网的更多内容!