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使用chardet判断字符编码
May 09 Python
python图像处理之反色实现方法
May 30 Python
python目录与文件名操作例子
Aug 28 Python
Python实现嵌套列表去重方法示例
Dec 28 Python
pandas pivot_table() 按日期分多列数据的方法
Nov 16 Python
使用python3实现操作串口详解
Jan 01 Python
django 控制页面跳转的例子
Aug 06 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
Feb 27 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 Python
68行Python代码实现带难度升级的贪吃蛇
Jan 18 Python
使用Python开发冰球小游戏
Apr 30 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
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
php下实现折线图效果的代码
2007/04/28 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
为数据添加append,remove功能
2006/10/03 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
再次谈论Javascript中的this
2016/06/23 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
2016/11/23 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
JS实现简单的选择题测评系统代码思路详解(demo)
2017/09/03 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
Python时区设置方法与pytz查询时区教程
2013/11/27 Python
Python 文件读写操作实例详解
2014/03/12 Python
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
关于Python3 类方法、静态方法新解
2019/08/30 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
使用CSS3制作版头动画效果
2020/12/24 HTML / CSS
应届生学校辅导员求职信
2013/11/07 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
2014年公司植树节活动方案
2014/03/04 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
廉政承诺书
2015/01/19 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
详解Vue的options
2021/05/15 Vue.js