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 相关文章推荐
Python实现处理管道的方法
Jun 04 Python
python3 实现的人人影视网站自动签到
Jun 19 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
Feb 03 Python
Python3中的bytes和str类型详解
May 02 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
Feb 07 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
Apr 11 Python
如何在Windows中安装多个python解释器
Jun 16 Python
通过代码实例解析Pytest运行流程
Aug 20 Python
如何基于Python爬虫爬取美团酒店信息
Nov 03 Python
【超详细】八大排序算法的各项比较以及各自特点
Mar 31 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系统流量分析的程序
2006/10/09 PHP
php checkbox 取值详细说明
2010/08/19 PHP
使用PHPMyAdmin修复论坛数据库的图文方法
2012/01/09 PHP
php查看当前Session的ID实例
2015/03/16 PHP
PHP实现动态压缩js与css文件的方法
2018/05/02 PHP
js静态作用域的功能。
2006/12/25 Javascript
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
javascript优先加载笔记代码
2008/09/30 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
JavaScript中的继承之类继承
2016/05/01 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
JavaScript核心语法总结(推荐)
2016/06/02 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
python3 与python2 异常处理的区别与联系
2016/06/19 Python
Python 调用Java实例详解
2017/06/02 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
2018/11/10 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
100%羊绒:NakedCashmere
2020/08/26 全球购物
企业办公室主任岗位职责
2014/02/19 职场文书
国贸专业求职信
2014/06/28 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
2014年党小组工作总结
2014/12/20 职场文书
5.12护士节活动总结
2015/02/10 职场文书
个人承诺书格式范文
2015/04/29 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android