Django 解决开发自定义抛出异常的问题

作者:Amberdreams 时间:2023-03-05 12:43:55 

在开发过程中,针对用户输入的不合法信息,我们应该在后端进行数据验证,并抛出相关的异常传递到前端来提示用户。

可是如何进行自定义抛出异常信息呢?通常处理方法有三种,我将依次介绍这三种方法。

第一种方法:

这种方法最为简单,只需要创建一个字典对象,通过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 自定义异常处理

1.

在settings.py中需要添加的配置

1.install app中添加  '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

自定义异常类 在主动抛出异常的时候就可以抛出一个下边类型的异常

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 # 新型错误

在视图或函数中主动抛出异常,


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)

工作流程

访问触发异常

自动抛出自定制异常

自定义异常捕获函数捕获到异常并将用户友好的数据返回给前端

来源:https://blog.csdn.net/Amberdreams/article/details/85223029

标签:Django,自定义,抛出,异常
0
投稿

猜你喜欢

  • Python通过DOM和SAX方式解析XML的应用实例分享

    2023-10-15 10:46:32
  • sql server海量数据库的查询优化及分页算法方案

    2010-07-02 21:17:00
  • dedecms中显示数字验证码的修改方法

    2024-06-05 09:39:40
  • python 爬取疫情数据的源码

    2022-05-22 13:21:54
  • Go语言基础switch条件语句基本用法及示例详解

    2024-04-26 17:33:30
  • GoLang切片相关问题梳理讲解

    2024-04-29 13:06:11
  • vue-element-admin项目导入和导出的实现

    2024-05-21 10:29:53
  • 浅谈javascript面向对象编程

    2009-03-03 12:04:00
  • 自己用python做的一款超炫酷音乐播放器

    2021-05-26 04:47:35
  • 详解Python if-elif-else知识点

    2022-02-23 16:06:23
  • 如何查看MySQL连接的root密码

    2024-01-25 08:47:43
  • python实现图片文件批量重命名

    2023-08-10 03:39:57
  • vue-cli 2.*中导入公共less文件的方法步骤

    2024-04-28 10:54:01
  • django写单元测试的方法

    2021-02-04 19:17:28
  • 利用Python和OpenCV库将URL转换为OpenCV格式的方法

    2021-08-10 13:41:43
  • Python数字图像处理之霍夫线变换实现详解

    2022-01-26 05:59:13
  • Python使用itchat模块实现简单的微信控制电脑功能示例

    2023-01-06 14:56:44
  • python多线程对多核cpu的利用解析

    2023-03-10 02:50:13
  • MySQL数据库十大优化技巧

    2024-01-25 22:51:28
  • Python实现统计代码行的方法分析

    2023-10-15 13:08:44
  • asp之家 网络编程 m.aspxhome.com