在Django框架中編寫Context處理器的方法

2022-10-04 11:09:26 字數 2459 閱讀 3972

寫context處理器的一些建議

編寫處理器的一些建議:

使每個context處理器完成盡可能小的功能。 使用多個處理器是很容易的,所以你可以根據邏輯塊來分解功能以便將來復用。

要注意 template_context_processors 裡的context processor 將會在基於這個settings.py的每個 模板中有效,所以變數的命名不要和模板的變數衝突。 變數名是大小寫敏感的,所以processor的變數全用大寫是個不錯的主意。

不論它們存放在哪個物理路徑下,只要在你的python搜尋路徑中,你就可以在 template_context_processors 設定裡指向它們。 建議你把它們放在應用或者工程目錄下名為 context_processors.py 的檔案裡。

html自動轉意

從模板生成html的時hysejso候,總是有乙個風險——變數包了含會影響結果html的字元。 例如,考慮這個模板片段:

hello, }.

一開始,這看起來是顯示使用者名稱的乙個無害的途徑,但是考慮如果使用者輸入如下的名字將會發生什麼:

用這個使用者名稱,模板將被渲染成:

hello,

這意味著瀏覽器將彈出j**ascript警告框!

類似的,如果使用者名稱包含小於符號,就像這樣:

使用者名稱那樣的話模板結果被翻譯成這樣:

hello, username

頁面的剩餘部分變成了粗體!

顯然,使用者提交的資料不應該被盲目信任,直接插入到你的頁面中。因為乙個潛在的惡意的使用者能夠利用這類漏洞做壞事。 這類漏洞稱為被跨域指令碼 (xss) 攻擊。 關於安全的更多內容,請看20章

為了避免這個問題,你有兩個選擇:

一是你可以確保每乙個不被信任的變數都被escape過濾器處理一遍,把潛在有害的html字元轉換為無害的。 這是最初幾年django的預設方案,但是這樣做的問題是它把責任推給你(開發者、模版作者)自己,來確保把所有東西轉意。 很容易就忘記轉意資料。

二是,你可以利用django的自動html轉意。 這一章的剩餘部分描述自動轉意是如何工作的。

在django裡預設情況下,每乙個模板自動轉意每乙個變數標籤的輸出。 尤其是這五個字元。

另外,我強調一下這個行為預設是開啟的。 如果你正在使用django的模板系統,那麼你是被保護的。

如何關閉它

如果你不想資料被自動轉意,在每一站點級別、每一模板級別或者每一變數級別你都有幾種方法來關閉它。

為什麼要關閉它? 因為有時候模板變數包含了一些原始html資料,在這種情況下我們不想它們的內容被轉意。 例如,你可能在資料庫裡儲存了一段被信任的html**,並且你想直接把它嵌入到你的模板裡。 或者,你可能正在使用django的模板系統生成非html文字,比如一封e-mail。

對於單獨的變數

用safe過濾器為單獨的變數關閉自動轉意:

this will be escaped: }

this will not be escaped: }

你可以把safe當做safe from further escaping的簡寫,或者當做可以被直接譯成html的內容。在這個例子裡,如果資料報含'',那麼輸出會變成:

this will be escaped:

this will not be escaped:

對於模板塊

為了控制模板的自動轉意,用標籤autoescape來包裝整個模板(或者模板中常用的部分),就像這樣:

hello }

autoescape 標籤有兩個引數on和off 有時,你可能想阻止一部分自動轉意,對另一部分自動轉意。 這是乙個模板的例子:

auto-escaping is on by default. hello }

this will not be auto-escaped: }.

nor this: }

auto-escaping applies again: }

auto-escaping 標籤的作用域不僅可以影響到當前模板還可以通過include標籤作用到其他標籤,就像block標籤一樣。 例如:

# base.html

# child.html

this & that

}由於在base模板中自動轉意被關hysejso閉,所以在child模板中自動轉意也會關閉.因此,在下面一段html被提交時,變數grehysejsoeting的值就為字串hello!

hello!

備註通常,模板作者沒必要為自動轉意擔心. 基於pyhton的開發者(編寫views檢視和自hysejso定義過濾器)只需要考慮哪些資料不需要被轉意,適時的標記資料,就可以讓它們在模板中工作。

如果你正在編寫乙個模板而不知道是否要關閉自動轉意,那就為所有需要轉意的變數新增乙個escape過濾器。 當自動轉意開啟時,使用escape過濾器似乎會兩次轉意資料,但其實沒有任何危險。因為escape過濾器不作用於被轉意過的變數。

本文標題: 在django框架中編寫context處理器的方法

本文位址: /jiaoben/python/128333.html

在Python的Django框架中編寫編譯函式

當遇到乙個模板標籤 template tag 時,模板解析器就會把標籤包含的內容,以及模板解析器自己作程式設計客棧為引數呼叫乙個python函式。這個函式負責返回乙個和當前模板標籤內容相對應的節點 node 的例項。例如,寫乙個顯示當前日期的模板標籤 該標籤會根據引數指定的 strftime 格式 ...

在Python的Django框架中建立和使用模版

如何使用模板系統 讓我們深入研究模板系統,你將會明白它是如何工作的。但我們暫不打算將它與先前建立的檢視結合在一起,因為我們現在的目的是了解它是如何獨立工作的。換言之,通常你會將模板和檢視一起使用,但是我們只是想突出模板系統是乙個python庫,你可以在任何地方使用它,而不僅僅是在django檢視中。...

Django中models的編寫

models的編寫 1 通過orm建立資料表from django.db import models create your models here.class publisher models.model name models.charfield max length 20 address mo...