亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

django中嵌套的try-except實例

瀏覽:4日期:2024-10-01 10:53:39

我就廢話不多說了,大家還是直接看代碼吧!

# 因為此時為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實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
相關文章:
主站蜘蛛池模板: 国产成+人+综合+亚洲 欧美 | 妞干网在线视频 | 日成人网 | 求毛片| 高清黄色一级片 | 欧美性色福利视频在线观看 | 亚洲一区无码中文字幕 | 精品国产福利第一区二区三区 | 国产免费人做爰午夜视频 | 特黄特级a级黄毛片免费观看多人 | 正在播真实出轨炮对白 | 日本精品久久久久中文字幕8 | 明星换脸高清一区二区 | 日本中出视频 | 免费观看日本高清a毛片 | 青青操国产在线 | 成人免费v片在线观看 | 国产女精品 | 欧美日韩久久中文字幕 | 成人性生活免费看 | 欧美一区二区精品系列在线观看 | 在线观看激情偷拍视频 | 日韩三区 | 在线观看91精品国产hd | 精品视频免费在线观看 | 大伊人青草狠狠久久 | 中文字幕专区在线亚洲 | 黄视频免费观看 | 国产精品吹潮香蕉在线观看 | 在线视频国产网址你懂的在线视频 | 黄色片短视频 | 东京不太热在线新视频 | 国产在线观看91精品2021 | 国产美女在线看 | 亚洲精品免费观看 | 三级黄色片免费 | 国产精品一区二区三区四区 | 九九九热在线精品免费全部 | 青青自拍视频一区二区三区 | 国产肥老妇免费视频 | 国产成人精品日本亚洲11 |