django中嵌套的try-except实例


Posted in Python onMay 21, 2020

我就废话不多说了,大家还是直接看代码吧!

# 因为此时为yaml模板,而且只抓取node port,所以这样处理效率快
content_dict = parse_yaml(content.replace("{{", "").replace("}}", ""))
if 'service' in content_dict.keys():
  # 记录本次yaml里所有的node_port,并更新到数据库
  now_app_list = []
  for service_item in content_dict['service']:
    for port_item in service_item['port']:
      if 'nodePort' in port_item.keys():
        node_port = int(port_item['nodePort'])
        if 30000 <= node_port <= 32000:
          # 这里判断比较复杂,如果端口有,而且app相同,不更新。如果端口有,app不一样,报冲突。如果端口没有,可插入。
          now_app_list.append(node_port)
          try:
            AppPort.objects.get(node_port=node_port, app=app)
            pass
          except AppPort.DoesNotExist:
            try:
              AppPort.objects.get(node_port=node_port)
              messages.info(self.request, 'nodeport{}端口冲突!'.format(node_port))
              return HttpResponseRedirect(reverse_lazy("app:yaml_edit", kwargs=self.kwargs))
            except AppPort.DoesNotExist:
              name = '{}-{}'.format(app.name, node_port)
              AppPort.objects.create(
                name=name,
                app=app,
                node_port=node_port
              )
        else:
          messages.info(self.request, 'nodeport{}端口不在指定范围内(30000-~32000)!'.format(node_port))
          return HttpResponseRedirect(reverse_lazy("app:yaml_edit", kwargs=self.kwargs))
  # 取出AppPort里所有此app的node_port,多余的要清除。
  all_app_list = AppPort.objects.filter(app=app).values_list('node_port', flat=True)
  if all_app_list:
    # 取交集,也就是数据库里多余的端口列表
    diff_list = [x for x in all_app_list if x not in now_app_list]
    if diff_list:
      AppPort.objects.filter(node_port__in=diff_list).delete()

感觉上面这段代码,应用的技术点蛮多的,作个记录。

包括其node port的管理思想,提取技巧。

orm的列表扁平化,列表交集,批量删除

补充知识:Django 在异常捕获中进行数据库保存,保存后将异常再抛出

需求:

当我检查配额时,如果配额不足,我需要将订单状态改为5,然后再将原有异常抛出

一:最初做法

try:
  self.check_quota_enough(create_form) # 检查配额
except Exception as e:
  self.object.state = 5
  self.object.save()
  raise e

存在问题:django默认开启了事务,因此我保存订单状态后,再抛异常时没有任何问题

但当我查询数据库订单状态时,发现异常抛出之前订单改变的状态已经丢失

二:优化,使用装饰器,手动关闭事务

# 在dispatch方法上增加装饰器,关闭事务
class xxxxxxxx():
 @method_decorator(transaction.non_atomic_requests)
 def dispatch(self, request, *args, **kwargs):
   return super().dispatch(request, *args, **kwargs)
 
 def form_valid(self, form):
 ...
 ...
 try:
   self.check_quota_enough(create_form) # 检查配额
 except Exception as e:
   self.object.state = 5
   self.object.save()
   raise e

该方法可以解决上述问题

但该方法对整个视图有效,如果在视图其他地方需要用到事务的一致性,则显然不合理

二:优化,定义事务保存点,在局部控制事务一致性

class xxxxxxxx():
 
 def form_valid(self, form):
 ...
 ...
 sid = transaction.savepoint() # 定义事务保存点
    try:
      self.check_quota_enough(create_form)
    except QuotaNotEnough as e:
      self.object.state = 5
      self.object.save()
      transaction.savepoint_commit(sid)
      return self.render_to_json_response(result=False, messages=str(e))

django中嵌套的try-except实例

a.save():此处保存了数据

sid = transaction.savepoint():设置保存点

b.save():此处再次保存了数据

接下来就是逻辑处理:如果满足xxxxxxxx条件,则手动提交,此时a.save()和b.save()保存的数据都会生效。

如果不满足xxxxxxxx条件,则执行事务回滚,此时我们定义的保存点之前的a.save()数据不会收到影响,但在保存点之后的b.save()的数据将会回滚。

所以我们可以通过调整保存点的位置,实现我们的需求。

以上这篇django中嵌套的try-except实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python3编写C/S网络程序实例教程
Aug 25 Python
python循环监控远程端口的方法
Mar 14 Python
Python 操作文件的基本方法总结
Aug 10 Python
python+selenium打印当前页面的titl和url方法
Jun 22 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
基于django传递数据到后端的例子
Aug 16 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
Python基于numpy模块实现回归预测
May 14 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
May 18 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 Python
Spark处理数据排序问题如何避免OOM
May 21 #Python
Django 解决开发自定义抛出异常的问题
May 21 #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
You might like
php调用mysql存储过程
2007/02/14 PHP
MySQL授权问题总结
2007/05/06 PHP
关于PHP内存溢出问题的解决方法
2013/06/25 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
Mootools 1.2教程 设置和获取样式表属性
2009/09/15 Javascript
JS window.opener返回父页面的应用
2009/10/24 Javascript
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
利用Keydown事件阻止用户输入实现代码
2014/03/11 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
Python获取文件所在目录和文件名的方法
2017/01/12 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
Python实现多进程的四种方式
2019/02/22 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
医生自荐信
2013/10/11 职场文书
高三学习决心书
2014/03/11 职场文书
热门专业求职信
2014/05/24 职场文书
销售员岗位职责
2015/02/10 职场文书
村官2015年度工作总结
2015/10/14 职场文书