pythontry⾥⾯嵌套try_django中嵌套的try-except实例我就废话不多说了,⼤家还是直接看代码吧!
# 因为此时为yaml模板,⽽且只抓取node port,所以这样处理效率快
django项目实例content_dict = parse_place("{{", "").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:
(node_port=node_port, app=app)
pass
except AppPort.DoesNotExist:
try:
(node_port=node_port)
messages.quest, 'nodeport{}端⼝冲突!'.format(node_port))
return HttpResponseRedirect(reverse_lazy("app:yaml_edit", kwargs=self.kwargs))
except AppPort.DoesNotExist:
name = '{}-{}'.format(app.name, node_port)
ate(
name=name,
app=app,
node_port=node_port
)
else:
messages.quest, '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__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)
der_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实例就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持脚本之家。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论