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中os.path用法分析
Jan 15 Python
python如何实现远程控制电脑(结合微信)
Dec 21 Python
Python zip()函数用法实例分析
Mar 17 Python
利用Python批量提取Win10锁屏壁纸实战教程
Mar 27 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
为什么Python中没有&quot;a++&quot;这种写法
Nov 27 Python
Python爬虫设置代理IP(图文)
Dec 23 Python
flask框架json数据的拿取和返回操作示例
Nov 28 Python
Pytorch转tflite方式
May 25 Python
keras.layer.input()用法说明
Jun 16 Python
keras用auc做metrics以及早停实例
Jul 02 Python
django模型类中,null=True,blank=True用法说明
Jul 09 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中全局变量global的使用演示代码
2011/05/18 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
纯js分页代码(简洁实用)
2013/11/05 Javascript
轻松创建nodejs服务器(3):代码模块化
2014/12/18 NodeJs
Javascript核心读书有感之词法结构
2015/02/01 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
JS实现烟花爆炸效果
2020/03/10 Javascript
如何利用nodejs实现命令行游戏
2020/11/24 NodeJs
简单理解Python中的装饰器
2015/07/31 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
python3.5绘制随机漫步图
2018/08/27 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
IronPython连接MySQL的方法步骤
2019/12/27 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
Python callable内置函数原理解析
2020/03/05 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
某公司部分笔试题
2013/11/05 面试题
工商技校毕业生自荐信
2013/11/15 职场文书
个人承诺书怎么写
2014/05/24 职场文书
小学安全汇报材料
2014/08/14 职场文书
争先创优公开承诺书
2014/08/30 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
新娘婚礼致辞
2015/07/27 职场文书
2015团员个人年度总结
2015/11/24 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
JavaScript分页组件使用方法详解
2021/07/26 Javascript