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中random模块用法实例分析
May 19 Python
python获取局域网占带宽最大3个ip的方法
Jul 09 Python
Python对象类型及其运算方法(详解)
Jul 05 Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 Python
TensorFlow实现模型评估
Sep 07 Python
Django 路由控制的实现代码
Nov 08 Python
Django Rest framework频率原理与限制
Jul 26 Python
python中dict()的高级用法实现
Nov 13 Python
keras用auc做metrics以及早停实例
Jul 02 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 Python
浅析Python 序列化与反序列化
Aug 05 Python
Python中tkinter的用户登录管理的实现
Apr 22 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 DB 数据库连接类定义与用法示例
2019/03/11 PHP
一些有关检查数据的JS代码
2006/09/07 Javascript
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
vue的keep-alive中使用EventBus的方法
2019/04/23 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
在Python中的Django框架中进行字符串翻译
2015/07/27 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
HTML5新增加的功能详解
2016/09/05 HTML / CSS
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
会计专业自我鉴定范文
2013/10/06 职场文书
建筑工地文明标语
2014/10/09 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
二婚主持词
2015/06/30 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
Python中os模块的简单使用及重命名操作
2021/04/17 Python
对PyTorch中inplace字段的全面理解
2021/05/22 Python
Nginx动静分离配置实现与说明
2022/04/07 Servers