在Python的Django框架中調(diào)用方法和處理無效變量
方法調(diào)用行為
方法調(diào)用比其他類型的查找略為復(fù)雜一點(diǎn)。 以下是一些注意事項(xiàng):
在方法查找過程中,如果某方法拋出一個(gè)異常,除非該異常有一個(gè) silent_variable_failure 屬性并且值為 True ,否則的話它將被傳播。如果異常被傳播,模板里的指定變量會(huì)被置為空字符串,比如:
>>> t = Template("My name is {{ person.first_name }}.")
>>> class PersonClass3:
... def first_name(self):
... raise AssertionError, "foo"
>>> p = PersonClass3()
>>> t.render(Context({"person": p}))
Traceback (most recent call last):
...
AssertionError: foo
>>> class SilentAssertionError(AssertionError):
... silent_variable_failure = True
>>> class PersonClass4:
... def first_name(self):
... raise SilentAssertionError
>>> p = PersonClass4()
>>> t.render(Context({"person": p}))
u'My name is .'
僅在方法無需傳入?yún)?shù)時(shí),其調(diào)用才有效。 否則,系統(tǒng)將會(huì)轉(zhuǎn)移到下一個(gè)查找類型(列表索引查找)。
顯然,有些方法是有副作用的,好的情況下允許模板系統(tǒng)訪問它們可能只是干件蠢事,壞的情況下甚至?xí)l(fā)安全漏洞。
例如,你的一個(gè) BankAccount 對象有一個(gè) delete() 方法。 如果某個(gè)模板中包含了像 {{ account.delete }}這樣的標(biāo)簽,其中`` account`` 又是BankAccount 的一個(gè)實(shí)例,請注意在這個(gè)模板載入時(shí),account對象將被刪除。
要防止這樣的事情發(fā)生,必須設(shè)置該方法的 alters_data 函數(shù)屬性:
def delete(self): # Delete the account delete.alters_data = True
模板系統(tǒng)不會(huì)執(zhí)行任何以該方式進(jìn)行標(biāo)記的方法。 接上面的例子,如果模板文件里包含了 {{ account.delete }} ,對象又具有 delete()方法,而且delete() 有alters_data=True這個(gè)屬性,那么在模板載入時(shí), delete()方法將不會(huì)被執(zhí)行。 它將靜靜地錯(cuò)誤退出。
如何處理無效變量
默認(rèn)情況下,如果一個(gè)變量不存在,模板系統(tǒng)會(huì)把它展示為空字符串,不做任何事情來表示失敗。 例如:
>>> from django.template import Template, Context
>>> t = Template('Your name is {{ name }}.')
>>> t.render(Context())
u'Your name is .'
>>> t.render(Context({'var': 'hello'}))
u'Your name is .'
>>> t.render(Context({'NAME': 'hello'}))
u'Your name is .'
>>> t.render(Context({'Name': 'hello'}))
u'Your name is .'
系統(tǒng)靜悄悄地表示失敗,而不是引發(fā)一個(gè)異常,因?yàn)檫@通常是人為錯(cuò)誤造成的。 這種情況下,因?yàn)樽兞棵绣e(cuò)誤的狀況或名稱, 所有的查詢都會(huì)失敗。 現(xiàn)實(shí)世界中,對于一個(gè)web站點(diǎn)來說,如果僅僅因?yàn)橐粋€(gè)小的模板語法錯(cuò)誤而造成無法訪問,這是不可接受的。
- 使用Python的Django框架實(shí)現(xiàn)事務(wù)交易管理的教程
- python django事務(wù)transaction源碼分析詳解
- 詳解Python的Django框架中的Cookie相關(guān)處理
- Python的Django框架中的表單處理示例
- 在Django同1個(gè)頁面中的多表單處理詳解
- Django處理文件上傳File Uploads的實(shí)例
- 在Django框架中編寫Context處理器的方法
- Django 跨域請求處理的示例代碼
- django框架使用orm實(shí)現(xiàn)批量更新數(shù)據(jù)的方法
- 獲取django框架orm query執(zhí)行的sql語句實(shí)現(xiàn)方法分析
- django的ORM模型的實(shí)現(xiàn)原理
- django框架事務(wù)處理小結(jié)【ORM 事務(wù)及raw sql,customize sql 事務(wù)處理】
相關(guān)文章
Python基于callable函數(shù)檢測對象是否可被調(diào)用
這篇文章主要介紹了Python基于callable函數(shù)檢測對象是否可被調(diào)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
Python基礎(chǔ)教程之淺拷貝和深拷貝實(shí)例詳解
這篇文章主要介紹了Python基礎(chǔ)教程之淺拷貝和深拷貝實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07
Python網(wǎng)絡(luò)編程之HTTP協(xié)議的python應(yīng)用
HTTP是在網(wǎng)絡(luò)上傳輸HTML的協(xié)議,用于瀏覽器和服務(wù)器的通信,這篇文章主要介紹了Python網(wǎng)絡(luò)編程之HTTP協(xié)議的python應(yīng)用,需要的朋友可以參考下2022-11-11
python3中_from...import...與import?...之間的區(qū)別詳解(包/模塊)
Python編碼第一步是導(dǎo)入模塊,有時(shí)候用import?***有時(shí)候用from...import,下面這篇文章主要給大家介紹了關(guān)于python3中_from...import...與import?...之間區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-08-08
使用python數(shù)據(jù)清洗代碼實(shí)例
這篇文章主要介紹了使用python數(shù)據(jù)清洗代碼實(shí)例,分享一下近期用python做數(shù)據(jù)清洗匯總的相關(guān)代碼,這里我們用到的python包有pandas、numpy、os等,需要的朋友可以參考下2023-07-07
python 對dataframe下面的值進(jìn)行大規(guī)模賦值方法
今天小編就為大家分享一篇python 對dataframe下面的值進(jìn)行大規(guī)模賦值方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
django authenticate用戶身份認(rèn)證的項(xiàng)目實(shí)踐
Django的contrib.auth模塊中的authenticate()函數(shù)用于對用戶的憑據(jù)進(jìn)行身份驗(yàn)證,本文就來介紹一下django authenticate用戶身份認(rèn)證的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08

