在Django框架中編寫(xiě)Context處理器的方法
寫(xiě)Context處理器的一些建議
編寫(xiě)處理器的一些建議:
使每個(gè)context處理器完成盡可能小的功能。 使用多個(gè)處理器是很容易的,所以你可以根據(jù)邏輯塊來(lái)分解功能以便將來(lái)復(fù)用。
要注意 TEMPLATE_CONTEXT_PROCESSORS 里的context processor 將會(huì)在基于這個(gè)settings.py的每個(gè) 模板中有效,所以變量的命名不要和模板的變量沖突。 變量名是大小寫(xiě)敏感的,所以processor的變量全用大寫(xiě)是個(gè)不錯(cuò)的主意。
不論它們存放在哪個(gè)物理路徑下,只要在你的Python搜索路徑中,你就可以在 TEMPLATE_CONTEXT_PROCESSORS 設(shè)置里指向它們。 建議你把它們放在應(yīng)用或者工程目錄下名為 context_processors.py 的文件里。
html自動(dòng)轉(zhuǎn)意
從模板生成html的時(shí)候,總是有一個(gè)風(fēng)險(xiǎn)——變量包了含會(huì)影響結(jié)果html的字符。 例如,考慮這個(gè)模板片段:
Hello, {{ name }}.
一開(kāi)始,這看起來(lái)是顯示用戶名的一個(gè)無(wú)害的途徑,但是考慮如果用戶輸入如下的名字將會(huì)發(fā)生什么:
<script>alert('hello')</script>
用這個(gè)用戶名,模板將被渲染成:
Hello, <script>alert('hello')</script>
這意味著瀏覽器將彈出JavaScript警告框!
類(lèi)似的,如果用戶名包含小于符號(hào),就像這樣:
用戶名
那樣的話模板結(jié)果被翻譯成這樣:
Hello, <b>username
頁(yè)面的剩余部分變成了粗體!
顯然,用戶提交的數(shù)據(jù)不應(yīng)該被盲目信任,直接插入到你的頁(yè)面中。因?yàn)橐粋€(gè)潛在的惡意的用戶能夠利用這類(lèi)漏洞做壞事。 這類(lèi)漏洞稱(chēng)為被跨域腳本 (XSS) 攻擊。 關(guān)于安全的更多內(nèi)容,請(qǐng)看20章
為了避免這個(gè)問(wèn)題,你有兩個(gè)選擇:
一是你可以確保每一個(gè)不被信任的變量都被escape過(guò)濾器處理一遍,把潛在有害的html字符轉(zhuǎn)換為無(wú)害的。 這是最初幾年Django的默認(rèn)方案,但是這樣做的問(wèn)題是它把責(zé)任推給你(開(kāi)發(fā)者、模版作者)自己,來(lái)確保把所有東西轉(zhuǎn)意。 很容易就忘記轉(zhuǎn)意數(shù)據(jù)。
二是,你可以利用Django的自動(dòng)html轉(zhuǎn)意。 這一章的剩余部分描述自動(dòng)轉(zhuǎn)意是如何工作的。
在django里默認(rèn)情況下,每一個(gè)模板自動(dòng)轉(zhuǎn)意每一個(gè)變量標(biāo)簽的輸出。 尤其是這五個(gè)字符。
- ``\ ``
- System Message: WARNING/2 (<string>, line 491); backlink
- Inline literal start-string without end-string.
- > 被轉(zhuǎn)換為>
- '(單引號(hào))被轉(zhuǎn)換為'
- "(雙引號(hào))被轉(zhuǎn)換為"
- & is converted to &
另外,我強(qiáng)調(diào)一下這個(gè)行為默認(rèn)是開(kāi)啟的。 如果你正在使用django的模板系統(tǒng),那么你是被保護(hù)的。
如何關(guān)閉它
如果你不想數(shù)據(jù)被自動(dòng)轉(zhuǎn)意,在每一站點(diǎn)級(jí)別、每一模板級(jí)別或者每一變量級(jí)別你都有幾種方法來(lái)關(guān)閉它。
為什么要關(guān)閉它? 因?yàn)橛袝r(shí)候模板變量包含了一些原始html數(shù)據(jù),在這種情況下我們不想它們的內(nèi)容被轉(zhuǎn)意。 例如,你可能在數(shù)據(jù)庫(kù)里存儲(chǔ)了一段被信任的html代碼,并且你想直接把它嵌入到你的模板里。 或者,你可能正在使用Django的模板系統(tǒng)生成非html文本,比如一封e-mail。
對(duì)于單獨(dú)的變量
用safe過(guò)濾器為單獨(dú)的變量關(guān)閉自動(dòng)轉(zhuǎn)意:
This will be escaped: {{ data }} This will not be escaped: {{ data|safe }}
你可以把safe當(dāng)做safe from further escaping的簡(jiǎn)寫(xiě),或者當(dāng)做可以被直接譯成HTML的內(nèi)容。在這個(gè)例子里,如果數(shù)據(jù)包含'',那么輸出會(huì)變成:
This will be escaped: <b> This will not be escaped: <b>
對(duì)于模板塊
為了控制模板的自動(dòng)轉(zhuǎn)意,用標(biāo)簽autoescape來(lái)包裝整個(gè)模板(或者模板中常用的部分),就像這樣:
{% autoescape off %} Hello {{ name }} {% endautoescape %}
autoescape 標(biāo)簽有兩個(gè)參數(shù)on和off 有時(shí),你可能想阻止一部分自動(dòng)轉(zhuǎn)意,對(duì)另一部分自動(dòng)轉(zhuǎn)意。 這是一個(gè)模板的例子:
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 標(biāo)簽的作用域不僅可以影響到當(dāng)前模板還可以通過(guò)include標(biāo)簽作用到其他標(biāo)簽,就像block標(biāo)簽一樣。 例如:
# 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模板中自動(dòng)轉(zhuǎn)意被關(guān)閉,所以在child模板中自動(dòng)轉(zhuǎn)意也會(huì)關(guān)閉.因此,在下面一段HTML被提交時(shí),變量greeting的值就為字符串Hello!
<h1>This & that</h1> <b>Hello!</b>
備注
通常,模板作者沒(méi)必要為自動(dòng)轉(zhuǎn)意擔(dān)心. 基于Pyhton的開(kāi)發(fā)者(編寫(xiě)VIEWS視圖和自定義過(guò)濾器)只需要考慮哪些數(shù)據(jù)不需要被轉(zhuǎn)意,適時(shí)的標(biāo)記數(shù)據(jù),就可以讓它們?cè)谀0逯泄ぷ鳌?/p>
如果你正在編寫(xiě)一個(gè)模板而不知道是否要關(guān)閉自動(dòng)轉(zhuǎn)意,那就為所有需要轉(zhuǎn)意的變量添加一個(gè)escape過(guò)濾器。 當(dāng)自動(dòng)轉(zhuǎn)意開(kāi)啟時(shí),使用escape過(guò)濾器似乎會(huì)兩次轉(zhuǎn)意數(shù)據(jù),但其實(shí)沒(méi)有任何危險(xiǎn)。因?yàn)閑scape過(guò)濾器不作用于被轉(zhuǎn)意過(guò)的變量。
- 使用Python的Django框架實(shí)現(xiàn)事務(wù)交易管理的教程
- python django事務(wù)transaction源碼分析詳解
- 詳解Python的Django框架中的Cookie相關(guān)處理
- Python的Django框架中的表單處理示例
- 在Django同1個(gè)頁(yè)面中的多表單處理詳解
- Django處理文件上傳File Uploads的實(shí)例
- 在Python的Django框架中調(diào)用方法和處理無(wú)效變量
- Django 跨域請(qǐng)求處理的示例代碼
- django框架使用orm實(shí)現(xiàn)批量更新數(shù)據(jù)的方法
- 獲取django框架orm query執(zhí)行的sql語(yǔ)句實(shí)現(xiàn)方法分析
- django的ORM模型的實(shí)現(xiàn)原理
- django框架事務(wù)處理小結(jié)【ORM 事務(wù)及raw sql,customize sql 事務(wù)處理】
相關(guān)文章
致Python初學(xué)者 Anaconda入門(mén)使用指南完整版
相信大多數(shù) Python 的初學(xué)者們都曾為環(huán)境問(wèn)題而頭疼不已,但你并不孤獨(dú),大家都是這么折騰過(guò)來(lái)的。為了在入門(mén)時(shí)少走彎路,并且讓高漲的積極性不至于太受打擊,這里推薦使用 Anaconda 來(lái)管理你的安裝環(huán)境和各種工具包2018-04-04docker-py 用Python調(diào)用Docker接口的方法
今天小編就為大家分享一篇docker-py 用Python調(diào)用Docker接口的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5結(jié)合Qt Designer創(chuàng)建信號(hào)與槽的詳細(xì)方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5結(jié)合Qt Designer創(chuàng)建信號(hào)與槽的詳細(xì)方法與實(shí)例,需要的朋友可以參考下2020-03-03python實(shí)戰(zhàn)游戲之史上最難最虐的掃雷游戲沒(méi)有之一
這篇文章主要介紹了使用 python 實(shí)現(xiàn)掃雷游戲,不同于傳統(tǒng)過(guò)時(shí)的掃雷,今天我們用 Python 增加了新花樣,文中給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09解決import tensorflow導(dǎo)致jupyter內(nèi)核死亡的問(wèn)題
這篇文章主要介紹了解決import tensorflow導(dǎo)致jupyter內(nèi)核死亡的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02Python3連接SQLServer、Oracle、MySql的方法
這篇文章較詳細(xì)的給大家介紹了Python3連接SQLServer、Oracle、MySql的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-06-06Python深度學(xué)習(xí)之FastText實(shí)現(xiàn)文本分類(lèi)詳解
FastText是一種典型的深度學(xué)習(xí)詞向量的表示方法,它非常簡(jiǎn)單通過(guò)Embedding層將單詞映射到稠密空間,然后將句子中所有的單詞在Embedding空間中進(jìn)行平均,進(jìn)而完成分類(lèi)操作2022-09-09使用tensorflow DataSet實(shí)現(xiàn)高效加載變長(zhǎng)文本輸入
今天小編就為大家分享一篇使用tensorflow DataSet實(shí)現(xiàn)高效加載變長(zhǎng)文本輸入,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01