tornado下模板引擎的使用

模板引擎

  Tornado中的模板語言和django中相似,模板引擎將模板文件載入內存,而後將數據嵌入其中,最終獲取到一個完整的字符串,再將字符串返回給請求者。css

  Tornado =的模板支持「控制語句」和「表達語句」,控制語句是使用 {% 和 %} 包起來的 例如 {% if len(items) > 2 %}。表達語句是使用 {{ 和 }} 包起來的,例如 {{ items[0] }}html

  控制語句和對應的 Python 語句的格式基本徹底相同。咱們支持 ifforwhile 和 try,這些語句邏輯結束的位置須要用 {% end %} 作標記。還經過 extends 和 block 語句實現了模板繼承。這些在 template 模塊 的代碼文檔中有着詳細的描述。python

  tornado模 板語言,不管for或者if,結尾都是end,不像django的endfor、endif;另外,tornado模板語言,取數據時跟python如出一轍,以下面的取字典裏的數據,能夠直接dict['key'],也能夠dict.get('key','default');不像django裏的item.1。

  注:在使用模板前須要在setting中設置模板路徑:"template_path" : "tpl"jquery

1.基本使用

import tornado.ioloop
import tornado.web
  
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html", list_info = [11,22,33],title='Mytitle')
  
application = tornado.web.Application([
    (r"/index", MainHandler),
])
  
if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
app.py
<html>
   <head>
      <title>{{ title }}</title>
   </head>
   <body>
     <ul>
       {% for item in list_info %}
         <li>{{item)}}</li>
       {% end %}
     </ul>
   </body>
 </html>
index.html

  表達式能夠是任意的Python表達式, 包括函數調用. 模板代碼會在包含如下對象 和函數的命名空間中執行 (注意這個列表適用於使用 RequestHandler.render 和 render_string 渲染模板的狀況. 若是你直接在 RequestHandler 以外使用 tornado.template 模塊, 下面這些不少都不存 在)git

在模板中默認提供了一些函數、字段、類以供模板使用:

escape: tornado.escape.xhtml_escape 的別名
xhtml_escape: tornado.escape.xhtml_escape 的別名
url_escape: tornado.escape.url_escape 的別名
json_encode: tornado.escape.json_encode 的別名
squeeze: tornado.escape.squeeze 的別名
linkify: tornado.escape.linkify 的別名
datetime: Python 的 datetime 模組
handler: 當前的 RequestHandler 對象
request: handler.request 的別名
current_user: handler.current_user 的別名
locale: handler.locale 的別名
_: handler.locale.translate 的別名
static_url: for handler.static_url 的別名
xsrf_form_html: handler.xsrf_form_html 的別名
其餘方法

2.繼承

<html>
<body>
    <header>
        {% block header %}{% end %}
    </header>
    <content>
        {% block body %}{% end %}
    </content>
    <footer>
        {% block footer %}{% end %}
    </footer>
</body>
</html>
layout.html

當咱們擴展父模板layout.html時,能夠在子模板index.html中引用這些塊。github

{% extends "layout.html" %}

{% block header %}
    <h1>{{ header_text }}</h1>
{% end %}

{% block body %}
    <p>Hello from the child template!</p>
{% end %}

{% block footer %}
    <p>{{ footer_text }}</p>
{% end %}
index.html

三、導入(include)

<div>
    <ul>
        <li>1024</li>
        <li>42區</li>
    </ul>
</div>
header.html
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>title</title>
    <link href="{{static_url("css/common.css")}}" rel="stylesheet" />
</head>
<body>

    <div class="pg-header">
        {% include 'header.html' %}
    </div>
    
    <script src="{{static_url("js/jquery-1.8.2.min.js")}}"></script>
    
</body>
</html>
index.html

四、自定義UIMethod以UIModule

a. 定義web

# uimethods.py
 
def tab(self):
    return 'UIMethod'
uimethods.py
from tornado.web import UIModule
from tornado import escape

class custom(UIModule):

    def render(self, *args, **kwargs):
        return escape.xhtml_escape('<h1>hello world</h1>')
       
uimodules.py

b. 註冊數據庫

import tornado.ioloop
import tornado.web
from tornado.escape import linkify
import uimodules as md
import uimethods as mt

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('index.html')

settings = {
    'template_path': 'template',
    'static_path': 'static',
    'static_url_prefix': '/static/',
    'ui_methods': mt,
    'ui_modules': md,
}

application = tornado.web.Application([
    (r"/index", MainHandler),
], **settings)


if __name__ == "__main__":
    application.listen(8009)
    tornado.ioloop.IOLoop.instance().start()
View Code

c. 使用django

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <link href="{{static_url("commons.css")}}" rel="stylesheet" />
</head>
<body>
    <h1>hello</h1>
    {% module custom(123) %}
    {{ tab() }}
</body>
View Code

五、模板的自動轉義問題

  Tornado默認會自動轉義模板中的內容,把標籤轉換爲相應的HTML實體。這樣能夠防止後端爲數據庫的網站被惡意腳本攻擊。好比,你的網站中有一個評論部分,用戶能夠在這裏添加任何他們想說的文字進行討論。雖然一些HTML標籤在標記和樣式衝突時不構成重大威脅(如評論中沒有閉<h1>標籤),但<script>標籤會容許攻擊者加載其餘的JavaScript文件,打開通向跨站腳本攻擊、XSS或漏洞之門。json

  全部模板輸出默認都會使用 tornado.escape.xhtml_escape 函數轉義. 這個行爲能夠經過傳遞 autoescape=None 給 Application 或者 tornado.template.Loader 構造器來全局改變, 對於一個模板文件可使 用 {% autoescape None %} 指令, 對於一個單一表達式可使用 {% raw ...%} 來代替 {{ ... }}. 此外, 在每一個地方一個可選的 轉義函數名能夠被用來代替 None.

  方法一:是在Application構造函數中傳遞autoescape=None,另外一種方法是在每頁的基礎上修改自動轉義行爲,以下所示:

{% autoescape None %}
{{ mailLink }}

這些autoescape塊不須要結束標籤,而且能夠設置xhtml_escape來開啓自動轉義(默認行爲),或None來關閉。

  然而,在理想的狀況下,你但願保持自動轉義開啓以便繼續防禦你的網站。所以,你可使用{% raw %}指令來輸出不轉義的內容。

{% raw mailLink %}
相關文章
相關標籤/搜索