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设计模式之单例模式实例
Apr 26 Python
浅析python 内置字符串处理函数的使用方法
Jun 11 Python
用Python实现通过哈希算法检测图片重复的教程
Apr 02 Python
python利用rsa库做公钥解密的方法教程
Dec 10 Python
Python补齐字符串长度的实例
Nov 15 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
Python自动重新加载模块详解(autoreload module)
Apr 01 Python
Python如何输出警告信息
Jul 30 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
Pytorch GPU内存占用很高,但是利用率很低如何解决
Jun 01 Python
Python FuzzyWuzzy实现模糊匹配
Apr 28 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下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
深入分析Javascript事件代理
2016/01/30 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
实例解析Array和String方法
2016/12/14 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
uni app仿微信顶部导航条功能
2019/09/17 Javascript
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
学习python可以干什么
2019/02/26 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
Python字符串的修改方法实例
2019/12/19 Python
Python matplotlib可视化实例解析
2020/06/01 Python
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
酒店副总岗位职责
2013/12/24 职场文书
同事吵架检讨书
2014/02/05 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
获奖感言怎么写
2015/07/31 职场文书