国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Tornado-06、Tornado模板轉義和模板繼承

levius / 3094人閱讀

摘要:模板轉義和模板繼承模板的轉義默認會自動轉義模板中的內容,把標簽轉換為相應的實體。這樣可以防止后端為數據庫的網站被惡意腳本攻擊。

Tornado模板轉義和模板繼承


1.模板的轉義

Tornado 默認會自動轉義模板中的內容,把標簽轉換為相應的HTML實體。這樣可以防止后端為數據庫的網站被惡意腳本攻擊。比如,你的網站中有一個評論部分,用戶可以在這里添加任何他們想說的文字進行討論。雖然一些HTML標簽在標記和樣式沖突時不構成重大威脅(如評論中沒有閉標簽),但標簽會允許攻擊者加載其他的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 %}

這個地方我們添加了鏈接,我們可以在頁面上點擊相應的頁面來跳轉到其他的頁面去。



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

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

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

{{ atag }}

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


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

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

1.取消全局轉義,在Application中添加配置項

autoescape=None,

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

{% autoescape None %}   #實現整個文檔的取消轉義

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

3.也可以使用 {% raw xxx %} 來輸出不轉義內容

{% raw atag %}

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

static_url函數來生成static目錄下的URL



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

2.模板的繼承

把多個頁面相同的內容提取出來放在一個base.html文件中,各個子html文件不同的內容 使用塊語句占位,子html文件重寫這個塊中的內容。

base.html文件如下:

 
    
    
        
        Tornado
    
    
        {% block body%}
        
this is base {% end %} {% block js %}{% end %}

extend.html如下


{% extends "./base.html" %}

服務器代碼如下:

#路由映射如下
(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")




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

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

#繼承時子模板替換父模板中同名的塊
{% block name %}
    #這里寫的內容會替換模板中的內容,如果不寫使用父模板的內容
{% 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 %}

記住,當頁面繼承其他頁面之后,需要實現相應的塊才有作用,在塊外面的代碼是沒有作用的。

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

您還沒有登錄

在extends.html中添加如下:

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

執行之后就可以看到效果。



文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44641.html

相關文章

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

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

    shiguibiao 評論0 收藏0
  • Tornado學習筆記(2)

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

    tianyu 評論0 收藏0

發表評論

0條評論

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