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编程中的反模式实例分析
Dec 08 Python
Pyhton中防止SQL注入的方法
Feb 05 Python
python执行外部程序的常用方法小结
Mar 21 Python
python连接MySQL数据库实例分析
May 12 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
python使用PyCharm进行远程开发和调试
Nov 02 Python
解决python matplotlib imshow无法显示的问题
May 24 Python
在python环境下运用kafka对数据进行实时传输的方法
Dec 27 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
Aug 17 Python
Python for循环与getitem的关系详解
Jan 02 Python
Python优秀开源项目Rich源码解析的流程分析
Jul 06 Python
python图片灰度化处理的几种方法
Jun 23 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
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
深入分析PHP优化及注意事项
2016/07/04 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
JS 类型转换常见方法小结
2010/05/31 Javascript
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
Angular2-primeNG文件上传模块FileUpload使用详解
2017/01/14 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
在 Vue 中编写 SVG 图标组件的方法
2020/02/24 Javascript
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
在Django中预防CSRF攻击的操作
2020/03/13 Python
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
Get The Label中文官网:英国运动时尚购物平台
2017/04/19 全球购物
光电信息专业应届生求职信
2013/10/07 职场文书
长安大学毕业生自我鉴定
2014/01/17 职场文书
老总助理工作岗位职责
2014/02/06 职场文书
责任书格式范文
2014/07/28 职场文书
运动会闭幕词
2015/01/28 职场文书
数学教师求职信范文
2015/03/20 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书
详解python的内存分配机制
2021/05/10 Python