摘要:模板轉義和模板繼承模板的轉義默認會自動轉義模板中的內容,把標簽轉換為相應的實體。這樣可以防止后端為數據庫的網站被惡意腳本攻擊。
Tornado模板轉義和模板繼承
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于2015年11月6日發布,該版本正式支持Python3.5的async/await關鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個關鍵字,這無疑是一種進步。其次...
摘要:而這里的方法則是告訴來讀取模板文件,并將結果返回給瀏覽器。依舊可以使用,等條件控制語句,但是要記得以結尾。替換字符串中的字符為編碼形式。模塊模塊是封裝模板中包含的標記樣式以及行為的可復用組件。 表單和模板 import os.path import tornado.httpserver import tornado.ioloop import tornado.options impo...
閱讀 1757·2021-11-11 16:55
閱讀 2545·2021-08-27 13:11
閱讀 3622·2019-08-30 15:53
閱讀 2300·2019-08-30 15:44
閱讀 1378·2019-08-30 11:20
閱讀 1036·2019-08-30 10:55
閱讀 942·2019-08-29 18:40
閱讀 3028·2019-08-29 16:13