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 相关文章推荐
Pyramid添加Middleware的方法实例
Nov 27 Python
python抽象基类用法实例分析
Jun 04 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
python smtplib模块自动收发邮件功能(二)
May 22 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
使用python Telnet远程登录执行程序的方法
Jan 26 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
Keras自定义IOU方式
Jun 10 Python
经验丰富程序员才知道的8种高级Python技巧
Jul 27 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 28 Python
Django操作cookie的实现
May 26 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP一些有意思的小区别
2006/12/06 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
PHP7创建销毁session的实例方法
2020/02/03 PHP
javascript中的float运算精度实例分析
2010/08/21 Javascript
jquery提升性能最佳实践小结
2010/12/06 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
jquery实现的一个导航滚动效果具体代码
2013/05/27 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
2016/06/18 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
微信小程序表单验证错误提示效果
2017/05/19 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
Vue实现圆环进度条的示例
2021/02/06 Vue.js
在Python的web框架中配置app的教程
2015/04/30 Python
Python单元和文档测试实例详解
2019/04/11 Python
python中pdb模块实例用法
2021/01/15 Python
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
信息专业大学生自我评价分享
2014/01/17 职场文书
品牌转让协议书
2014/08/20 职场文书
招商引资工作汇报
2014/10/28 职场文书
初中生毕业评语
2014/12/29 职场文书
导游词之桂林山水
2019/09/20 职场文书