摘要:模板轉(zhuǎn)義和模板繼承模板的轉(zhuǎn)義默認(rèn)會(huì)自動(dòng)轉(zhuǎn)義模板中的內(nèi)容,把標(biāo)簽轉(zhuǎn)換為相應(yīng)的實(shí)體。這樣可以防止后端為數(shù)據(jù)庫(kù)的網(wǎng)站被惡意腳本攻擊。
Tornado模板轉(zhuǎn)義和模板繼承
Tornado 默認(rèn)會(huì)自動(dòng)轉(zhuǎn)義模板中的內(nèi)容,把標(biāo)簽轉(zhuǎn)換為相應(yīng)的HTML實(shí)體。這樣可以防止后端為數(shù)據(jù)庫(kù)的網(wǎng)站被惡意腳本攻擊。比如,你的網(wǎng)站中有一個(gè)評(píng)論部分,用戶可以在這里添加任何他們想說(shuō)的文字進(jìn)行討論。雖然一些HTML標(biāo)簽在標(biāo)記和樣式?jīng)_突時(shí)不構(gòu)成重大威脅(如評(píng)論中沒(méi)有閉標(biāo)簽),但標(biāo)簽會(huì)允許攻擊者加載其他的JavaScript文件,打開(kāi)通向跨站腳本攻擊、XSS或漏洞之門。
首先 我們?cè)趖ornado文件夾下新建一個(gè)lesson5文件夾 添加templates文件夾
在lesson5下新建一個(gè)start1.py文件 加入以下代碼
#路由為: (r"/temp",TempHandler), class TempHandler(tornado.web.RequestHandler): def get(self): username = self.get_argument("name","no") import time urllist = [ ("https://www.baidu.com/","百度"), ("https://www.zhihu.com/","知乎"), ] self.render("escape.html", username=username, time=time, urllist=urllist, )
在templates文件夾下新建escape.html文件 并在該文件的body中添加以下代碼
{% for url in urllist %} {{ url[1] }}
{% end %}
這個(gè)地方我們添加了鏈接,我們可以在頁(yè)面上點(diǎn)擊相應(yīng)的頁(yè)面來(lái)跳轉(zhuǎn)到其他的頁(yè)面去。
接下來(lái)我們?cè)赥empHandler服務(wù)中添加或修改成如下代碼:
atag = ""---百度---"
" self.render("escape.html", username=username, time=time, urllist=urllist, atag=atag )
并在escape.html的body中加入以下代碼
{{ atag }}
這個(gè)時(shí)候我們?cè)賮?lái)看看頁(yè)面
我們發(fā)現(xiàn)這個(gè)時(shí)候我們加上的這個(gè)代碼是作為一個(gè)字符串輸出,并沒(méi)有被瀏覽器解析出來(lái),這個(gè)就是轉(zhuǎn)義,tornado會(huì)自動(dòng)的轉(zhuǎn)義,把所有的輸出都作為字符串,這樣做的就能防止一些惡意代碼在輸出到前端時(shí)被執(zhí)行,從而造成數(shù)據(jù)泄露。
當(dāng)然這個(gè)默認(rèn)自動(dòng)是轉(zhuǎn)義的,如果不要轉(zhuǎn)義也是可以的,有如下方法:
1.取消全局轉(zhuǎn)義,在Application中添加配置項(xiàng)
autoescape=None,
2.注釋掉上面的autoescape=None在html文檔最開(kāi)始添加
{% autoescape None %} #實(shí)現(xiàn)整個(gè)文檔的取消轉(zhuǎn)義
#在開(kāi)啟全局和文檔不轉(zhuǎn)義的情況下,可以使用 escape() 來(lái)開(kāi)啟變量的轉(zhuǎn)義 {{ atag }} {{ escape(atag) }}
3.也可以使用 {% raw xxx %} 來(lái)輸出不轉(zhuǎn)義內(nèi)容
{% raw atag %}
tornado是默認(rèn)自動(dòng)開(kāi)啟轉(zhuǎn)義的,大家可以根據(jù)需求來(lái)選是否轉(zhuǎn)義,但是要知道轉(zhuǎn)義的本意是來(lái)防止瀏覽器意外執(zhí)行惡意代碼的,所以去掉轉(zhuǎn)義的時(shí)候需要謹(jǐn)慎選擇。
static_url函數(shù)來(lái)生成static目錄下的URL
引用靜態(tài)文件有上面 兩種寫法,使用上面的這種形式,那么為什么使用static_url而不是在你的模板中硬編碼呢?有如下幾個(gè)原因。其一,static_url函數(shù)創(chuàng)建了一個(gè)基于文件內(nèi)容的hash值,并將其添加到URL末尾(查詢字符串的參數(shù)v)。這個(gè)hash值確保瀏覽器總是加載一個(gè)文件的最新版而不是之前的緩存版本。無(wú)論是在你應(yīng)用的開(kāi)發(fā)階段,還是在部署到生產(chǎn)環(huán)境使用時(shí),都非常有用,因?yàn)槟愕挠脩舨槐卦贋榱丝吹侥愕撵o態(tài)內(nèi)容而清除瀏覽器緩存了。
2.模板的繼承把多個(gè)頁(yè)面相同的內(nèi)容提取出來(lái)放在一個(gè)base.html文件中,各個(gè)子html文件不同的內(nèi)容 使用塊語(yǔ)句占位,子html文件重寫這個(gè)塊中的內(nèi)容。
base.html文件如下:
Tornado {% block body%}
this is base {% end %} {% block js %}{% end %}
extend.html如下
{% extends "./base.html" %}
服務(wù)器代碼如下:
#路由映射如下 (r"/base",BaseIndexHandler), (r"/extends",ExtendsHandler), class BaseIndexHandler(tornado.web.RequestHandler): def get(self): self.render("base.html") class ExtendsHandler(tornado.web.RequestHandler): def get(self): username = "haha" self.render("extend.html")
在上面,我們可以看到繼承的模板里面沒(méi)有寫任何東西,只是繼承了父模板,同樣父模板的所有內(nèi)容就都可以繼承過(guò)來(lái)了,省去了大量的重復(fù)部分代碼。
#從父模塊繼承 {% extend filename %} #繼承時(shí)子模板替換父模板中同名的塊 {% block name %} #這里寫的內(nèi)容會(huì)替換模板中的內(nèi)容,如果不寫使用父模板的內(nèi)容 {% end %} #引入其他的模板文件 {% include filename %}
先在base.html 的body中添加下列代碼
{% block handy%}
this is handy {% end %}
繼承之后可以重寫父類的塊
在templates文件夾下新建extend.html文件
{% extends "./base.html" %} {% block title %} {{ username }} {% end %} {% block body %} {% if username!="no" %} 歡迎用戶 {{ username }} 登錄
我是繼承的 哈哈哈
hahahaha{% include "./include.html" %} {% else %} 您還沒(méi)有登錄 {% end %} {% end %}
記住,當(dāng)頁(yè)面繼承其他頁(yè)面之后,需要實(shí)現(xiàn)相應(yīng)的塊才有作用,在塊外面的代碼是沒(méi)有作用的。
當(dāng)然可以引入模板,include.html如下:
您還沒(méi)有登錄
在extends.html中添加如下:
hahahaha{% include "./include.html" %}
執(zhí)行之后就可以看到效果。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/44641.html
摘要:譯者說(shuō)于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容。 譯者說(shuō) Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個(gè)關(guān)鍵字,這無(wú)疑是一種進(jìn)步。其次...
摘要:而這里的方法則是告訴來(lái)讀取模板文件,并將結(jié)果返回給瀏覽器。依舊可以使用,等條件控制語(yǔ)句,但是要記得以結(jié)尾。替換字符串中的字符為編碼形式。模塊模塊是封裝模板中包含的標(biāo)記樣式以及行為的可復(fù)用組件。 表單和模板 import os.path import tornado.httpserver import tornado.ioloop import tornado.options impo...
閱讀 1857·2021-11-11 16:55
閱讀 2655·2021-08-27 13:11
閱讀 3695·2019-08-30 15:53
閱讀 2362·2019-08-30 15:44
閱讀 1480·2019-08-30 11:20
閱讀 1101·2019-08-30 10:55
閱讀 992·2019-08-29 18:40
閱讀 3115·2019-08-29 16:13