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


Posted in Python onMay 21, 2020

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

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

第一种方法:

这种方法最为简单,只需要创建一个字典对象,通过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)

工作流程

访问触发异常

自动抛出自定制异常

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

以上这篇Django 解决开发自定义抛出异常的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python图像灰度变换及图像数组操作
Jan 27 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
python中for循环输出列表索引与对应的值方法
Nov 07 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
python yield和Generator函数用法详解
Feb 10 Python
Python为何不支持switch语句原理详解
Oct 21 Python
python读取excel数据并且画图的实现示例
Feb 08 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 Python
Python中的程序流程控制语句
Feb 24 Python
python超详细实现完整学生成绩管理系统
Mar 17 Python
Python实现Matplotlib,Seaborn动态数据图
May 06 Python
Python logging模块写入中文出现乱码
May 21 #Python
django的403/404/500错误自定义页面的配置方式
May 21 #Python
python 3.8.3 安装配置图文教程
May 21 #Python
Python中的xlrd模块使用原理解析
May 21 #Python
python中sklearn的pipeline模块实例详解
May 21 #Python
Python使用re模块验证危险字符
May 21 #Python
Django 解决新建表删除后无法重新创建等问题
May 21 #Python
You might like
PHP开启gzip页面压缩实例代码
2010/03/11 PHP
zend framework多模块多布局配置
2011/02/26 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
2014/07/01 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
JavaScript代码应该放在HTML代码哪个位置比较好?
2014/10/16 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
jstree的简单实例
2016/12/01 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
jQuery 选择器用法实例分析【prev + next】
2020/05/22 jQuery
js实现带积分弹球小游戏
2020/07/21 Javascript
jupyter安装小结
2016/03/13 Python
python组合无重复三位数的实例
2018/11/13 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
HTML5中的新元素介绍
2008/10/17 HTML / CSS
error和exception有什么区别
2012/10/02 面试题
放弃遗产继承公证书
2015/01/26 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
签证工作证明模板
2015/06/15 职场文书
新闻稿格式范文
2015/07/18 职场文书
交通事故协议书范本
2016/03/19 职场文书
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python