最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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,并更新到數(shù)據(jù)庫
  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:
          # 這里判斷比較復(fù)雜,如果端口有,而且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{}端口不在指定范圍內(nèi)(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:
    # 取交集,也就是數(shù)據(jù)庫里多余的端口列表
    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()

感覺上面這段代碼,應(yīng)用的技術(shù)點蠻多的,作個記錄。

包括其node port的管理思想,提取技巧。

orm的列表扁平化,列表交集,批量刪除

補充知識:Django 在異常捕獲中進行數(shù)據(jù)庫保存,保存后將異常再拋出

需求:

當(dāng)我檢查配額時,如果配額不足,我需要將訂單狀態(tài)改為5,然后再將原有異常拋出

一:最初做法

try:
  self.check_quota_enough(create_form) # 檢查配額
except Exception as e:
  self.object.state = 5
  self.object.save()
  raise e

存在問題:django默認(rèn)開啟了事務(wù),因此我保存訂單狀態(tài)后,再拋異常時沒有任何問題

但當(dāng)我查詢數(shù)據(jù)庫訂單狀態(tài)時,發(fā)現(xiàn)異常拋出之前訂單改變的狀態(tài)已經(jīng)丟失

二:優(yōu)化,使用裝飾器,手動關(guān)閉事務(wù)

# 在dispatch方法上增加裝飾器,關(guān)閉事務(wù)
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

該方法可以解決上述問題

但該方法對整個視圖有效,如果在視圖其他地方需要用到事務(wù)的一致性,則顯然不合理

二:優(yōu)化,定義事務(wù)保存點,在局部控制事務(wù)一致性

class xxxxxxxx():
 
 def form_valid(self, form):
 ...
 ...
 sid = transaction.savepoint() # 定義事務(wù)保存點
    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():此處保存了數(shù)據(jù)

sid = transaction.savepoint():設(shè)置保存點

b.save():此處再次保存了數(shù)據(jù)

接下來就是邏輯處理:如果滿足xxxxxxxx條件,則手動提交,此時a.save()和b.save()保存的數(shù)據(jù)都會生效。

如果不滿足xxxxxxxx條件,則執(zhí)行事務(wù)回滾,此時我們定義的保存點之前的a.save()數(shù)據(jù)不會收到影響,但在保存點之后的b.save()的數(shù)據(jù)將會回滾。

所以我們可以通過調(diào)整保存點的位置,實現(xiàn)我們的需求。

以上這篇django中嵌套的try-except實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決PyQt5 無邊框后窗口的移動問題

    解決PyQt5 無邊框后窗口的移動問題

    這篇文章主要介紹了解決PyQt5 無邊框后窗口的移動問題,具有很好的參考價值,希望對大家有所幫助,一起跟隨小編過來看看吧
    2021-03-03
  • 使用Python腳本和ADB命令實現(xiàn)卸載App

    使用Python腳本和ADB命令實現(xiàn)卸載App

    這篇文章主要介紹了使用Python腳本和ADB命令實現(xiàn)卸載App的實現(xiàn)方法,文中給出了完整的示例代碼,相信對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。
    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文件的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 利用Python代碼實現(xiàn)模擬動態(tài)指針時鐘

    利用Python代碼實現(xiàn)模擬動態(tài)指針時鐘

    這篇文章主要為大家詳細介紹了如何利用python和C++代碼實現(xiàn)模擬動態(tài)指針時鐘,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • 在python中將list分段并保存為array類型的方法

    在python中將list分段并保存為array類型的方法

    今天小編就為大家分享一篇在python中將list分段并保存為array類型的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Python使用xlrd和xlwt實現(xiàn)自動化操作Excel

    Python使用xlrd和xlwt實現(xiàn)自動化操作Excel

    這篇文章主要介紹了Python使用xlrd和xlwt實現(xiàn)自動化操作Excel,xlwt只能對Excel進行寫操作。xlwt和xlrd不光名字像,連很多函數(shù)和操作格式也是完全相
    2022-08-08
  • Python實現(xiàn)多路視頻多窗口播放功能

    Python實現(xiàn)多路視頻多窗口播放功能

    這篇文章主要為大家詳細介紹了Python實現(xiàn)多路視頻多窗口播放功能的相關(guān)知識,文中的示例代碼講解詳細,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Spring http服務(wù)遠程調(diào)用實現(xiàn)過程解析

    Spring http服務(wù)遠程調(diào)用實現(xiàn)過程解析

    這篇文章主要介紹了Spring http服務(wù)遠程調(diào)用實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Python讀取大型數(shù)據(jù)文件的6種方式匯總

    Python讀取大型數(shù)據(jù)文件的6種方式匯總

    在 Python 中,我們可以使用多種方法讀取大型數(shù)據(jù)文件,本文主要為大家介紹6個常用的Python讀取大型數(shù)據(jù)文件的方法,希望對大家有所幫助
    2023-05-05

最新評論

铜山县| 武城县| 泾川县| 昌宁县| 广西| 延安市| 石渠县| 龙胜| 乌兰浩特市| 军事| 丹巴县| 密云县| 彭阳县| 麟游县| 邵东县| 乌兰县| 上林县| 朝阳县| 赣州市| 乐业县| 新平| 襄汾县| 南陵县| 四川省| 威信县| 城固县| 耒阳市| 永嘉县| 收藏| 兰州市| 那坡县| 巩留县| 工布江达县| 奉贤区| 平利县| 武城县| 平南县| 绍兴县| 乌什县| 舞钢市| 邯郸市|