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条件和循环的使用方法
Nov 01 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
Python机器学习算法之k均值聚类(k-means)
Feb 23 Python
python通过Windows下远程控制Linux系统
Jun 20 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
python实现归并排序算法
Nov 22 Python
django echarts饼图数据动态加载的实例
Aug 12 Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 Python
python实现从ftp服务器下载文件
Mar 03 Python
python requests.get带header
May 05 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 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实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
深入剖析javascript中的exec与match方法
2016/05/18 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
Vue-resource安装过程及使用方法解析
2020/07/21 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Python中实现参数类型检查的简单方法
2015/04/21 Python
Python循环语句之break与continue的用法
2015/10/14 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
Python实现简易过滤删除数字的方法小结
2019/01/09 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
Python Lambda函数使用总结详解
2019/12/11 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
3个CCIE对一个工程师的面试题
2012/05/06 面试题
写好自荐信的技巧
2013/11/08 职场文书
办公室副主任岗位职责
2013/11/25 职场文书
求职简历中的自我评价分享
2013/12/08 职场文书
业务部经理岗位职责
2014/01/04 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
学习经验交流会主持词
2014/04/01 职场文书
年度优秀员工获奖感言
2014/08/15 职场文书
学习雷锋主题班会
2015/08/14 职场文书
护理自荐信
2019/05/14 职场文书