成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

levius / 3106人閱讀

摘要:模板轉(zhuǎn)義和模板繼承模板的轉(zhuǎn)義默認會自動轉(zhuǎn)義模板中的內(nèi)容,把標簽轉(zhuǎn)換為相應(yīng)的實體。這樣可以防止后端為數(shù)據(jù)庫的網(wǎng)站被惡意腳本攻擊。

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


1.模板的轉(zhuǎn)義

Tornado 默認會自動轉(zhuǎn)義模板中的內(nèi)容,把標簽轉(zhuǎn)換為相應(yīng)的HTML實體。這樣可以防止后端為數(shù)據(jù)庫的網(wǎng)站被惡意腳本攻擊。比如,你的網(wǎng)站中有一個評論部分,用戶可以在這里添加任何他們想說的文字進行討論。雖然一些HTML標簽在標記和樣式?jīng)_突時不構(gòu)成重大威脅(如評論中沒有閉標簽),但標簽會允許攻擊者加載其他的JavaScript文件,打開通向跨站腳本攻擊、XSS或漏洞之門。

首先 我們在tornado文件夾下新建一個lesson5文件夾 添加templates文件夾
在lesson5下新建一個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 %}

這個地方我們添加了鏈接,我們可以在頁面上點擊相應(yīng)的頁面來跳轉(zhuǎn)到其他的頁面去。



接下來我們在TempHandler服務(wù)中添加或修改成如下代碼:

atag = ""---百度---" 
" self.render("escape.html", username=username, time=time, urllist=urllist, atag=atag )

并在escape.html的body中加入以下代碼

{{ atag }}

這個時候我們再來看看頁面


我們發(fā)現(xiàn)這個時候我們加上的這個代碼是作為一個字符串輸出,并沒有被瀏覽器解析出來,這個就是轉(zhuǎn)義,tornado會自動的轉(zhuǎn)義,把所有的輸出都作為字符串,這樣做的就能防止一些惡意代碼在輸出到前端時被執(zhí)行,從而造成數(shù)據(jù)泄露。

當然這個默認自動是轉(zhuǎn)義的,如果不要轉(zhuǎn)義也是可以的,有如下方法:

1.取消全局轉(zhuǎn)義,在Application中添加配置項

autoescape=None,

2.注釋掉上面的autoescape=None在html文檔最開始添加

{% autoescape None %}   #實現(xiàn)整個文檔的取消轉(zhuǎn)義

#在開啟全局和文檔不轉(zhuǎn)義的情況下,可以使用  escape() 來開啟變量的轉(zhuǎn)義
{{ atag }}
{{ escape(atag) }}

3.也可以使用 {% raw xxx %} 來輸出不轉(zhuǎn)義內(nèi)容

{% raw atag %}

tornado是默認自動開啟轉(zhuǎn)義的,大家可以根據(jù)需求來選是否轉(zhuǎn)義,但是要知道轉(zhuǎn)義的本意是來防止瀏覽器意外執(zhí)行惡意代碼的,所以去掉轉(zhuǎn)義的時候需要謹慎選擇。

static_url函數(shù)來生成static目錄下的URL



引用靜態(tài)文件有上面 兩種寫法,使用上面的這種形式,那么為什么使用static_url而不是在你的模板中硬編碼呢?有如下幾個原因。其一,static_url函數(shù)創(chuàng)建了一個基于文件內(nèi)容的hash值,并將其添加到URL末尾(查詢字符串的參數(shù)v)。這個hash值確保瀏覽器總是加載一個文件的最新版而不是之前的緩存版本。無論是在你應(yīng)用的開發(fā)階段,還是在部署到生產(chǎn)環(huán)境使用時,都非常有用,因為你的用戶不必再為了看到你的靜態(tài)內(nèi)容而清除瀏覽器緩存了。

2.模板的繼承

把多個頁面相同的內(nèi)容提取出來放在一個base.html文件中,各個子html文件不同的內(nèi)容 使用塊語句占位,子html文件重寫這個塊中的內(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")




在上面,我們可以看到繼承的模板里面沒有寫任何東西,只是繼承了父模板,同樣父模板的所有內(nèi)容就都可以繼承過來了,省去了大量的重復(fù)部分代碼。

#從父模塊繼承
{% extend filename %}

#繼承時子模板替換父模板中同名的塊
{% block name %}
    #這里寫的內(nèi)容會替換模板中的內(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 %} 您還沒有登錄 {% end %} {% end %}

記住,當頁面繼承其他頁面之后,需要實現(xiàn)相應(yīng)的塊才有作用,在塊外面的代碼是沒有作用的。

當然可以引入模板,include.html如下:

您還沒有登錄

在extends.html中添加如下:

hahahaha{% include "./include.html" %}

執(zhí)行之后就可以看到效果。



文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44641.html

相關(guān)文章

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

    摘要:譯者說于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個關(guān)鍵字,這無疑是一種進步。其次,這是最后一個支持和的版本了,在后續(xù)的版本了會移除對它們的兼容。 譯者說 Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個關(guān)鍵字,這無疑是一種進步。其次...

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

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

    tianyu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<