国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2019-11-25 17:09:40
字體:
來源:轉載
供稿:網友

寫Context處理器的一些建議

編寫處理器的一些建議:

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

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

    不論它們存放在哪個物理路徑下,只要在你的Python搜索路徑中,你就可以在 TEMPLATE_CONTEXT_PROCESSORS 設置里指向它們。 建議你把它們放在應用或者工程目錄下名為 context_processors.py 的文件里。

html自動轉意

從模板生成html的時候,總是有一個風險――變量包了含會影響結果html的字符。 例如,考慮這個模板片段:

Hello, {{ name }}.

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

<script>alert('hello')</script>

用這個用戶名,模板將被渲染成:

Hello, <script>alert('hello')</script>

這意味著瀏覽器將彈出JavaScript警告框!

類似的,如果用戶名包含小于符號,就像這樣:

用戶名

那樣的話模板結果被翻譯成這樣:

Hello, <b>username

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

顯然,用戶提交的數據不應該被盲目信任,直接插入到你的頁面中。因為一個潛在的惡意的用戶能夠利用這類漏洞做壞事。 這類漏洞稱為被跨域腳本 (XSS) 攻擊。 關于安全的更多內容,請看20章

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

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

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

在django里默認情況下,每一個模板自動轉意每一個變量標簽的輸出。 尤其是這五個字符。

  •     ``/ ``
  •     System Message: WARNING/2 (<string>, line 491); backlink
  •     Inline literal start-string without end-string.
  •     > 被轉換為>
  •     '(單引號)被轉換為'
  •     "(雙引號)被轉換為"
  •     & is converted to &

另外,我強調一下這個行為默認是開啟的。 如果你正在使用django的模板系統,那么你是被保護的。
如何關閉它

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

為什么要關閉它? 因為有時候模板變量包含了一些原始html數據,在這種情況下我們不想它們的內容被轉意。 例如,你可能在數據庫里存儲了一段被信任的html代碼,并且你想直接把它嵌入到你的模板里。 或者,你可能正在使用Django的模板系統生成非html文本,比如一封e-mail。
對于單獨的變量

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

This will be escaped: {{ data }}This will not be escaped: {{ data|safe }}

你可以把safe當做safe from further escaping的簡寫,或者當做可以被直接譯成HTML的內容。在這個例子里,如果數據包含'',那么輸出會變成:

This will be escaped: <b>This will not be escaped: <b>

對于模板塊

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

{% autoescape off %} Hello {{ name }}{% endautoescape %}

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

Auto-escaping is on by default. Hello {{ name }}{% autoescape off %} This will not be auto-escaped: {{ data }}. Nor this: {{ other_data }} {% autoescape on %} Auto-escaping applies again: {{ name }} {% endautoescape %}{% endautoescape %}

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

# base.html{% autoescape off %}<h1>{% block title %}{% endblock %}</h1>{% block content %}{% endblock %}{% endautoescape %}# child.html{% extends "base.html" %}{% block title %}This & that{% endblock %}{% block content %}{{ greeting }}{% endblock %}

由于在base模板中自動轉意被關閉,所以在child模板中自動轉意也會關閉.因此,在下面一段HTML被提交時,變量greeting的值就為字符串Hello!

<h1>This & that</h1><b>Hello!</b>

備注

通常,模板作者沒必要為自動轉意擔心. 基于Pyhton的開發者(編寫VIEWS視圖和自定義過濾器)只需要考慮哪些數據不需要被轉意,適時的標記數據,就可以讓它們在模板中工作。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 札达县| 铅山县| 沂水县| 东辽县| 北京市| 海宁市| 罗山县| 汉寿县| 桃园市| 剑川县| 同心县| 东丽区| 小金县| 莲花县| 凌源市| 綦江县| 沂源县| 阜康市| 阜阳市| 丰宁| 加查县| 庆安县| 广元市| 新营市| 阿拉善右旗| 深州市| 如东县| 枣庄市| 隆尧县| 堆龙德庆县| 青川县| 昌江| 包头市| 永年县| 鄯善县| 吉水县| 竹溪县| 吉水县| 尚义县| 兰州市| 萨迦县|