Django RestFramework 全局异常处理详解

Django RestFramework 全局异常处理详解

目录

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默认处理了错误对象类似,将错误处理对象改为用中间件即可,处理的逻辑思路一样,不过类以及设置方法不一样而已

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注易知道(ezd.cc)的更多内容!

推荐阅读