django中嵌套的try-except实例

 更新时间:2020年05月21日 11:06:41   作者:weixin_30379531  
这篇文章主要介绍了django中嵌套的try-except实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

我就废话不多说了,大家还是直接看代码吧!

# 因为此时为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))

a.save():此处保存了数据

sid = transaction.savepoint():设置保存点

b.save():此处再次保存了数据

接下来就是逻辑处理:如果满足xxxxxxxx条件,则手动提交,此时a.save()和b.save()保存的数据都会生效。

如果不满足xxxxxxxx条件,则执行事务回滚,此时我们定义的保存点之前的a.save()数据不会收到影响,但在保存点之后的b.save()的数据将会回滚。

所以我们可以通过调整保存点的位置,实现我们的需求。

以上这篇django中嵌套的try-except实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决PyQt5 无边框后窗口的移动问题

    解决PyQt5 无边框后窗口的移动问题

    这篇文章主要介绍了解决PyQt5 无边框后窗口的移动问题,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧
    2021-03-03
  • 使用Python脚本和ADB命令实现卸载App

    使用Python脚本和ADB命令实现卸载App

    这篇文章主要介绍了使用Python脚本和ADB命令实现卸载App的实现方法,文中给出了完整的示例代码,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。
    2017-02-02
  • python脚本框架webpy的url映射详解

    python脚本框架webpy的url映射详解

    这篇文章主要为大家介绍了python脚本框架web.py的url映射的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Python使用minidom读写xml的方法

    Python使用minidom读写xml的方法

    这篇文章主要介绍了Python使用minidom读写xml的方法,实例分析了使用minidom模块操作XML文件的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 利用Python代码实现模拟动态指针时钟

    利用Python代码实现模拟动态指针时钟

    这篇文章主要为大家详细介绍了如何利用python和C++代码实现模拟动态指针时钟,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04
  • 在python中将list分段并保存为array类型的方法

    在python中将list分段并保存为array类型的方法

    今天小编就为大家分享一篇在python中将list分段并保存为array类型的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python使用xlrd和xlwt实现自动化操作Excel

    Python使用xlrd和xlwt实现自动化操作Excel

    这篇文章主要介绍了Python使用xlrd和xlwt实现自动化操作Excel,xlwt只能对Excel进行写操作。xlwt和xlrd不光名字像,连很多函数和操作格式也是完全相
    2022-08-08
  • Python实现多路视频多窗口播放功能

    Python实现多路视频多窗口播放功能

    这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • Spring http服务远程调用实现过程解析

    Spring http服务远程调用实现过程解析

    这篇文章主要介绍了Spring http服务远程调用实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python读取大型数据文件的6种方式汇总

    Python读取大型数据文件的6种方式汇总

    在 Python 中,我们可以使用多种方法读取大型数据文件,本文主要为大家介绍6个常用的Python读取大型数据文件的方法,希望对大家有所帮助
    2023-05-05

最新评论