Django开发中自定义异常处理的三种常用方法及DRF集成指南
本文详细介绍Django后端开发中处理非法用户输入的三种自定义异常抛出方式。包括通过字典对象传递错误信息、继承Exception类创建自定义异常以及基于object类的轻量级实现。此外,文章还补充了Django REST framework中通过配置EXCEPTION_HANDLER实现全局自定义异常捕获与友好返回的完整流程,涵盖settings配置、异常类定义及视图中的主动抛出示例。
Django自定义异常处理的三种基础方法
在Web应用开发过程中,当接收到用户提交的非法数据时,后端应当执行严格的数据验证逻辑,并将相应的错误信息以异常形式抛出,以便前端能够获取并展示给用户。
那么,具体该如何实现自定义异常的抛出呢?通常有三种主流处理方法,本文将逐一进行解析。
第一种实现方式:
该方式最为简便,核心思路是构建一个包含错误信息的字典对象,并通过render函数将其传递给前端模板进行渲染展示。
具体的字典对象结构如下:
result = {'code':'', 'message':''} render(request, 'xxx.html', result:result)
第二种实现方式:
此方法需要定义一个继承自Exception类的自定义异常类,具体代码实现如下:
# 利用继承自定义异常提示信息
class MyException(Exception):
def __init__(self, code, error, data):
self.code = code
self.error = error
self.data = data
try:
if not 1 < 0:
raise MyException(1001, '你的说法错误', '1不小于0')
except MyException as e:
pass
第三种实现方式:
可以自定义一个直接继承自object的普通类,用于封装异常相关的数据。
class MyTest(object):
def __init__(self):
# 自定义状态码
self.code = 1000
self.error = ''
self.data = ''
@property
def dict(self):
return self.__dict__
在需要触发自定义异常的逻辑节点,实例化该类并指定具体的错误代码、提示信息及数据内容。
# 创建实例对象
one = MyTest()
one.code = 1001
one.error = '你错了'
one.data = '请再次检查'
print(one.dict)
综上所述,以上三种方法均为笔者在后端进行数据校验并向前端传递异常信息的常用手段。
Django REST framework全局异常处理配置
补充知识:Django REST framework (DRF) 中的自定义异常处理机制
1.
在项目的settings.py配置文件中,需要进行以下相关配置:
1.在INSTALLED_APPS中添加 'rest_framework',
2.在settings配置文件中添加全局异常处理器的配置项:
REST_FRAMEWORK = { 'EXCEPTION_HANDLER':'common.restframework.xd_exceptions.custom_exception_handler', #这是使用自定制异常处理 }
xd_exceptions.py文件用于定义具体的异常处理函数逻辑。
from rest_framework.views import exception_handler
def custom_exception_handler(exc, context):
# Call REST framework's default exception handler first,
# to get the standard error response.
response = exception_handler(exc, context)
# Now add the HTTP status code to the response.
if response is not None:
response.data['status_code'] = response.status_code
print(response.data)
# response.data['message'] =response.data['detail'] #增加message这个key
# response.data['message'] ='方法不对' #增加message这个key
return response
在主动抛出异常时,可以抛出自定义的异常类实例,该类需继承自APIException。
my_errors.py文件内容如下:
from rest_framework import status
from rest_framework.exceptions import APIException
from common.tools import xd_status
# class ParseError(APIException):
# status_code = xd_status.HTTP_400_BAD_REQUEST
# default_detail = '这是.default_detail========'
# default_code = 'parse_error'
#
class XdError(APIException):
pass
class ParamError(XdError):
status_code = 400
class Unauthorized(XdError):
status_code = 401
class PermissionDenied(XdError):
status_code = 403
class ObjectNotFound(XdError):
status_code = 404
class ServerError(XdError):
status_code = 500
class ErrorCode:
UNAUTHORIZED = 10000 # 未登录
PERMISSION_DENIED = 10001 # 无权限
PARAM_ERROR = 40000 # 参数验证错误
DATA_NOT_FOUND = 40001 # 未找到数据
DATA_NOT_VALID = 40002 # 数据错误
REPEAT_POST = 40003 # 重复提交
EEEE = 40003 # 新型错误
在视图类或普通函数中,通过raise语句主动抛出上述定义的异常,
class SupserUserDetailView(APIView):
# authentication_classes = []
permission_classes = [SupserPermisson,]
def put(self,request,pk):
if not request.user.is_superuser:
if request.user.id != pk:
raise ParamError('用户没有修改权限', ErrorCode.EEEE) #这就是抛出自定义异常, 然后自己的异常捕获方式就能捕获这个异常
user = User.objects.filter(id=pk)
if not user:
raise ParamError('被修改的用户不存在', ErrorCode.EEEE)
data = handel_c_user(request.data)
user_obj = Creat_newuser_serializers(data=data, instance=user.first())
if user_obj.is_valid():
user_obj.save()
res={'status':"修改成功"}
return JsonResponse(data=res, code=200, desc="success", status=status.HTTP_200_OK)
res = {'status':user_obj.errors}
return JsonResponse(data=res,code=200,desc="success",status=status.HTTP_200_OK)
整体工作流程如下:
用户访问触发特定条件导致异常发生。
系统自动抛出预设的自定义异常。
自定义的异常捕获函数拦截该异常,并构造用户友好的数据格式返回给前端。
以上关于Django开发中自定义抛出异常的解决方案即为本文的全部内容,希望能为读者提供有价值的参考,也欢迎大家继续支持本站获取更多技术分享。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













