亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Tornado-06、Tornado模板轉(zhuǎn)義和模板繼承

levius / 3148人閱讀

摘要:模板轉(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)義和模板繼承


1.模板的轉(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

相關(guān)文章

  • Tornado 4.3文檔翻譯: 用戶指南-模板UI

    摘要:譯者說(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)步。其次...

    shiguibiao 評(píng)論0 收藏0
  • Tornado學(xué)習(xí)筆記(2)

    摘要:而這里的方法則是告訴來(lái)讀取模板文件,并將結(jié)果返回給瀏覽器。依舊可以使用,等條件控制語(yǔ)句,但是要記得以結(jié)尾。替換字符串中的字符為編碼形式。模塊模塊是封裝模板中包含的標(biāo)記樣式以及行為的可復(fù)用組件。 表單和模板 import os.path import tornado.httpserver import tornado.ioloop import tornado.options impo...

    tianyu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<