python try里面嵌套try_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实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

本文标题: django中嵌套的try-except实例

本文地址: http://www.cppcns.com/jiaoben/python/313891.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值