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深入学习之特殊方法与多范式
Aug 31 Python
Python端口扫描简单程序
Nov 10 Python
python如何实现反向迭代
Mar 20 Python
解决Python安装后pip不能用的问题
Jun 12 Python
解决csv.writer写入文件有多余的空行问题
Jul 06 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
Jul 18 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
Python 实现自动导入缺失的库
Oct 29 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
手把手教你安装Windows版本的Tensorflow
Mar 26 Python
完美解决Pycharm中matplotlib画图中文乱码问题
Jan 11 Python
如何用python识别滑块验证码中的缺口
Apr 01 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中的数组操作函数整理
2008/08/18 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
Python爬虫模拟登录带验证码网站
2016/01/22 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
2016/01/31 Python
详解Django之admin组件的使用和源码剖析
2018/05/04 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
python logging.info在终端没输出的解决
2020/05/12 Python
python打开文件的方式有哪些
2020/06/29 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
Python 如何展开嵌套的序列
2020/08/01 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
师范毕业生求职自荐信
2013/09/25 职场文书
给排水工程师岗位职责
2013/11/21 职场文书
校本教研工作方案
2014/01/14 职场文书
吨的认识教学反思
2014/04/27 职场文书
银行求职自荐信
2014/06/30 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
运动会3000米加油稿
2015/07/21 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
DE1103使用报告
2022/04/05 无线电
Web应用开发TypeScript使用详解
2022/05/25 Javascript