django中嵌套的try-except實(shí)例
我就廢話不多說(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()
感覺上面這段代碼,應(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)開啟了事務(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)文章
解決PyQt5 無(wú)邊框后窗口的移動(dòng)問(wèn)題
這篇文章主要介紹了解決PyQt5 無(wú)邊框后窗口的移動(dòng)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過(guò)來(lái)看看吧2021-03-03
使用Python腳本和ADB命令實(shí)現(xiàn)卸載App
這篇文章主要介紹了使用Python腳本和ADB命令實(shí)現(xiàn)卸載App的實(shí)現(xiàn)方法,文中給出了完整的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2017-02-02
利用Python代碼實(shí)現(xiàn)模擬動(dòng)態(tài)指針時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了如何利用python和C++代碼實(shí)現(xiàn)模擬動(dòng)態(tài)指針時(shí)鐘,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-04-04
Python使用xlrd和xlwt實(shí)現(xiàn)自動(dòng)化操作Excel
這篇文章主要介紹了Python使用xlrd和xlwt實(shí)現(xiàn)自動(dòng)化操作Excel,xlwt只能對(duì)Excel進(jìn)行寫操作。xlwt和xlrd不光名字像,連很多函數(shù)和操作格式也是完全相2022-08-08
Python實(shí)現(xiàn)多路視頻多窗口播放功能
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)多路視頻多窗口播放功能的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
Spring http服務(wù)遠(yuǎn)程調(diào)用實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Spring http服務(wù)遠(yuǎn)程調(diào)用實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python讀取大型數(shù)據(jù)文件的6種方式匯總
在 Python 中,我們可以使用多種方法讀取大型數(shù)據(jù)文件,本文主要為大家介紹6個(gè)常用的Python讀取大型數(shù)據(jù)文件的方法,希望對(duì)大家有所幫助2023-05-05

