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易忽视知识点小结
May 25 Python
Python中文字符串截取问题
Jun 15 Python
简述Python中的进程、线程、协程
Mar 18 Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 Python
python3中函数参数的四种简单用法
Jul 09 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
为什么说Python可以实现所有的算法
Oct 04 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
Python 去除字符串中指定字符串
Mar 05 Python
Python实现一个论文下载器的过程
Jan 18 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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
初识laravel5
2015/03/02 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
PHP框架性能测试报告
2016/05/08 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
2016/11/25 PHP
php实现等比例压缩图片
2018/07/26 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
javascript中获取选中对象的类型
2007/04/02 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
jquery控制左右箭头滚动图片列表的实例
2013/05/20 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
webpack4简单入门实例
2018/09/06 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
2018/10/09 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
详解Django通用视图中的函数包装
2015/07/21 Python
使用python3.5仿微软记事本notepad
2016/06/15 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
使用python将图片格式转换为ico格式的示例
2018/10/22 Python
Python K最近邻从原理到实现的方法
2019/08/15 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
SEPHORA丝芙兰德国官方购物网站:化妆品、护肤品和香水
2020/01/21 全球购物
意大利辅助药品、药物和补品在线销售:FarmaEurope
2020/04/29 全球购物
房地产营销策划方案
2014/02/08 职场文书
财务会计专业求职信
2014/06/09 职场文书
CSS3常见动画的实现方式
2021/04/14 HTML / CSS
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL