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的Twisted框架实现webshell密码扫描器的教程
Apr 16 Python
Python Web框架Tornado运行和部署
Oct 19 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
Python构建图像分类识别器的方法
Jan 12 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
python同时替换多个字符串方法示例
Sep 17 Python
Flask中endpoint的理解(小结)
Dec 11 Python
pytorch masked_fill报错的解决
Feb 18 Python
Python中格式化字符串的四种实现
May 26 Python
深入浅析Python代码规范性检测
Jul 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
ThinkPHP应用模式扩展详解
2014/07/16 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
JavaScript 函数式编程的原理
2009/10/16 Javascript
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
关于Js中new操作符的作用详解
2021/02/21 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
python dlib人脸识别代码实例
2019/04/04 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
python numpy中cumsum的用法详解
2019/10/17 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
详解pycharm2020.1.1专业版安装指南(推荐)
2020/08/07 Python
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
迪士尼西班牙官方网上商店:ShopDisney西班牙
2020/02/02 全球购物
课例研修方案
2014/05/31 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
高中生自我评价范文2015
2015/03/03 职场文书
运动会新闻稿
2015/07/17 职场文书
Python实现列表拼接和去重的三种方式
2021/07/02 Python
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python