亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

django中嵌套的try-except實(shí)例

 更新時(shí)間:2020年05月21日 11:06:41   作者:weixin_30379531  
這篇文章主要介紹了django中嵌套的try-except實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

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

# 因?yàn)榇藭r(shí)為yaml模板,而且只抓取node port,所以這樣處理效率快
content_dict = parse_yaml(content.replace("{{", "").replace("}}", ""))
if 'service' in content_dict.keys():
  # 記錄本次yaml里所有的node_port,并更新到數(shù)據(jù)庫(kù)
  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不一樣,報(bào)沖突。如果端口沒(méi)有,可插入。
          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ù)庫(kù)里多余的端口列表
    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()

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

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

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

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

需求:

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

一:最初做法

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

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

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

二:優(yōu)化,使用裝飾器,手動(dòng)關(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èn)題

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

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

class xxxxxxxx():
 
 def form_valid(self, form):
 ...
 ...
 sid = transaction.savepoint() # 定義事務(wù)保存點(diǎn)
    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è)置保存點(diǎn)

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

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

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

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

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

相關(guān)文章

  • pip 錯(cuò)誤unused-command-line-argument-hard-error-in-future解決辦法

    pip 錯(cuò)誤unused-command-line-argument-hard-error-in-future解決辦法

    這篇文章主要介紹了Python包管理器pip安裝軟件時(shí)出現(xiàn)unused-command-line-argument-hard-error-in-future錯(cuò)誤的解決辦法,需要的朋友可以參考下
    2014-06-06
  • python命令 -u參數(shù)用法解析

    python命令 -u參數(shù)用法解析

    這篇文章主要介紹了python命令 -u參數(shù)用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • python基礎(chǔ)之類(lèi)型轉(zhuǎn)換函數(shù)

    python基礎(chǔ)之類(lèi)型轉(zhuǎn)換函數(shù)

    這篇文章主要介紹了python類(lèi)型轉(zhuǎn)換函數(shù),實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下
    2021-10-10
  • Python中的pickle模塊解析

    Python中的pickle模塊解析

    這篇文章主要介紹了Python中的pickle模塊解析,pickle 模塊和 json 模塊很像,都有序列化的功能,不過(guò) pickle 模塊更加局限一些只能對(duì) python 使用,它可以對(duì)一個(gè) python 對(duì)象結(jié)構(gòu)的二進(jìn)制序列化和反序列化,需要的朋友可以參考下
    2023-09-09
  • Python ORM框架Peewee用法詳解

    Python ORM框架Peewee用法詳解

    這篇文章主要介紹了Python ORM框架Peewee用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python實(shí)現(xiàn)對(duì)圖片進(jìn)行旋轉(zhuǎn),放縮,裁剪的功能

    python實(shí)現(xiàn)對(duì)圖片進(jìn)行旋轉(zhuǎn),放縮,裁剪的功能

    今天小編就為大家分享一篇python實(shí)現(xiàn)對(duì)圖片進(jìn)行旋轉(zhuǎn),放縮,裁剪的功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Python小程序 控制鼠標(biāo)循環(huán)點(diǎn)擊代碼實(shí)例

    Python小程序 控制鼠標(biāo)循環(huán)點(diǎn)擊代碼實(shí)例

    這篇文章主要介紹了Python小程序 控制鼠標(biāo)循環(huán)點(diǎn)擊代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Python3爬蟲(chóng)中Splash的知識(shí)總結(jié)

    Python3爬蟲(chóng)中Splash的知識(shí)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于Python3爬蟲(chóng)中Splash的知識(shí)總結(jié)內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。
    2020-07-07
  • 基于Python函數(shù)的作用域規(guī)則和閉包(詳解)

    基于Python函數(shù)的作用域規(guī)則和閉包(詳解)

    下面小編就為大家分享一篇基于Python函數(shù)的作用域規(guī)則和閉包詳解,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • pycharm 使用tab跳出正在編輯的括號(hào)(){}{}等問(wèn)題

    pycharm 使用tab跳出正在編輯的括號(hào)(){}{}等問(wèn)題

    這篇文章主要介紹了pycharm 使用tab跳出正在編輯的括號(hào)(){}{}等問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02

最新評(píng)論