在Python的Django架構中調用方法和處理無效變數

來源:互聯網
上載者:User
方法調用行為

方法調用比其他類型的尋找略為複雜一點。 以下是一些注意事項:

在方法尋找過程中,如果某方法拋出一個異常,除非該異常有一個 silent_variable_failure 屬性並且值為 True ,否則的話它將被傳播。如果異常被傳播,模板裡的指定變數會被置為空白字串,比如:

>>> 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 .'

僅在方法無需傳入參數時,其調用才有效。 否則,系統將會轉移到下一個尋找類型(清單索引尋找)。

顯然,有些方法是有副作用的,好的情況下允許模板系統訪問它們可能只是幹件蠢事,壞的情況下甚至會引發安全性漏洞。

例如,你的一個 BankAccount 對象有一個 delete() 方法。 如果某個模板中包含了像 {{ account.delete }}這樣的標籤,其中`` account`` 又是BankAccount 的一個執行個體,請注意在這個模板載入時,account對象將被刪除。

要防止這樣的事情發生,必須設定該方法的 alters_data 函數屬性:

def delete(self):  # Delete the accountdelete.alters_data = True

模板系統不會執行任何以該方式進行標記的方法。 接上面的例子,如果模板檔案裡包含了 {{ account.delete }} ,對象又具有 delete()方法,而且delete() 有alters_data=True這個屬性,那麼在模板載入時, delete()方法將不會被執行。 它將靜靜地錯誤退出。

如何處理無效變數

預設情況下,如果一個變數不存在,模板系統會把它展示為空白字串,不做任何事情來表示失敗。 例如:

>>> 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 .'

系統靜悄悄地表示失敗,而不是引發一個異常,因為這通常是人為錯誤造成的。 這種情況下,因為變數名有錯誤的狀況或名稱, 所有的查詢都會失敗。 現實世界中,對於一個web網站來說,如果僅僅因為一個小的模板語法錯誤而造成無法訪問,這是不可接受的。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.