Tornado 包含一个简单、快速而且灵活的模板语言。

      Tornado同样可以使用任何其他的python模板语言,虽然没有集成这些模板语言进RequestHandler.render方法中。将模板渲染成字符串,然后传递给RequestHandler.write方法。

 

8.1 配置模板

       默认的,tornado在跟引用模板文件的py文件同一个文件目录中去查找模板文件。在不同的目录下放置模板文件,在Application setting中设置template_path选项(或者如果你想为不同的hanlder使用不同的模板路径,你可以重写RequestHandler.get_template_path方法)。

       从non_filesystem位置加载模板,继承tornado.template.BaseLoader,编写其子类,然后给application setting中的template_loader选项设值。

        默认情况下,编译后的模板会被缓存。关闭这个缓存然后重新加载,这样在模板文件的更新总是可见的,实现这个功能,将applcation中compliled_template_cache设值成False或者debug设置成True.

 

8.2 模板语法

        Tornado模板仅仅是HTML(或者其他文件格式的文件),使用了Python控制序列以及在标记中嵌入表达式。例如:

<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<ul>
{% for item in items %}
<li>{{ escape(item) }}</li>
{% end %}
</ul>
</body>
</html>

         如果你这个模板保存为“template.html”,然后将其与你的Python文件放置在同一个目录中,你可以使用以下方式渲染你的模板。

class MainHandler(tornado.web.RequestHandler):
def get(self):
items = ["Item 1", "Item 2", "Item 3"]
self.render("template.html", title="My title", items=items)

                       

            tornado模板支持控制语句和表达式。控制语句用{% %}包裹,比如{% if len(items) > 2 %}.表达式用{{ }}包裹,比如{{ items[0] }}。

           控制语句或多或少与Python语句精确映射。支持if、for 、while 以及try语句,所有的语句都以 {% end %}结束。使用extends 和block语句,同样支持模板的继承。

            表达式可以是任何Python表达式,甚至包括方法的调用。模板代码在包含以下对象和方法的名称空间中执行。

  • l escape :tornado.escape.xhtml_escape 的别名
  • l xhtml_escape : tornado.escape.xhtml_escape 的别名
  • l url_escape : tornado.escape.url_escape 的别名
  • l json_encode : tornado.escape.json_encode 的别名
  • l squeeze: tornado.escape.squeeze的别名
  • l linkify:tornado.escape.linkify的别名
  • l datetime : Python 的datetime模块
  • l handler:当前RequestHandler对象
  • l request : handler.request属性
  • l current_user : handerl.current_user属性
  • l locale :hanlder.locale属性
  • l _: hanlder.locale.translate 的别名
  • l static_url :handler.static_url的别名
  • l xsrf_form_html :hanlder. xsrf_form_html的别名
  • l reverse_url :Application. reverse_url的别名
  • l 来自Application Settings中的ui_methods以及ui_modules的入口
  • l 所有传递给render 或者render_string函数的关键字参数

        默认情况下,所有的模板输出都是编码转义的,使用tornado.escape.xhtml_escape函数。通过传递autoescape=None的参数给Application或者tornado.template.Loader构造函数,可以全局改变这种行为。而对于一个模板文件,可以使用{% autoescape None %}指令,或者对于单一表达式,使用{% raw %}替代{{ }}.

     注意,尽管在避免XSS缺陷方面,自动的转义是非常有用的,但是并不是在所有的情况都是有效的。在某种情况下出现的表达式,比如在Javascript或者CSS中,可能需要额外的转义。具体查看http://wonko.com/post/html-escaping

 

8.3 UI modules

        Tornado支持UI modules,这样使得支持标准、可复用的UI widgets更加容易。UI modules向特别的函数调用,用来渲染页面的组件,而且他们可以用他们自身的CSS 和Javascript 打包在一起。

        举个例子,如果你正在实现一个博客网站,你可能想使得博客入口同时出现在博客的网站的首页以及每一个博客页面,你可以使用Entry 模块去渲染他们。首先,为你的UI modules创建一个Python模块,比如uimodules.py.代码如下:

class Entry(tornado.web.UIModule):
def render(self, entry, show_comments=False):
return self.render_string(
"module-entry.html", entry=entry, show_comments=show_comments)

       然后在application的设置中使用ui_modules选项告诉tonado使用uimodules.py。代码如下:

from . import uimodules

class HomeHandler(tornado.web.RequestHandler):
def get(self):
entries = self.db.query("SELECT * FROM entries ORDER BY date DESC")
self.render("home.html", entries=entries) class EntryHandler(tornado.web.RequestHandler):
def get(self, entry_id):
entry = self.db.get("SELECT * FROM entries WHERE id = %s", entry_id)
if not entry: raise tornado.web.HTTPError(404)
self.render("entry.html", entry=entry) settings = {
"ui_modules": uimodules,
}
application = tornado.web.Application([
(r"/", HomeHandler),
(r"/entry/([0-9]+)", EntryHandler),
], **settings)

      在模板中,就可以通过{% module % }语句调用module.这样你可以在home.html以及entry.html中调用Entry模块。

      home.html 代码如下:

{% for entry in entries %}
  {% module Entry(entry) %}
{% end %}

      而,entry.html代码如下:

{% module Entry(entry, show_comments=True) %}

       Modules通过重写embedded_css,embedded_javascript,javascript_files或者css_files方法可以包括自定义的CSS和JavaScipt函数,代码如下:

lass Entry(tornado.web.UIModule):
def embedded_css(self):
return ".entry { margin-bottom: 1em; }" def render(self, entry, show_comments=False):
return self.render_string(
"module-entry.html", show_comments=show_comments)

                   

         Module的css和Javascript只会加载一次,而不管这个模块在页面使用很多次。CSS总是被包括在<head>头部,而javascript总是被包含在</body>标签之前。

tornado 学习笔记8 模板以及UI的更多相关文章

  1. tornado 学习笔记1 引言

    从事软件开发这行业也快5年啦,其实从事的工作也不完全是软件开发,软件开发只是我工作中的一部分.其中包括课题研究.信息化方案设计.软件开发.信息系统监理.项目管理等工作,比较杂乱.开发的软件比较多,但是 ...

  2. OpenCV 学习笔记(模板匹配)

    OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...

  3. Python Flask学习笔记之模板

    Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...

  4. Tornado学习笔记(一) helloword/多进程/启动参数

    前言 当你觉得你过得很舒服的时候,你肯定没有在进步.所以我想学习新的东西,然后选择了Tornado.因为我觉得Tornado更匹配目前的我的综合素质. Tornado学习笔记系列主要参考<int ...

  5. amazeui学习笔记--js插件(UI增强)--警告框Alert

    amazeui学习笔记--js插件(UI增强)--警告框Alert 一.总结 1.警告框基本样式:用am-alert声明div容器, <div class="am-alert" ...

  6. amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown

    amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown 一.总结 1.am-dropdown(及其孩子):控制下拉列表的样式 2.data-am-dropdown(及其孩子):控 ...

  7. amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse

    amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse 一.总结 注意点: 1.data-am-collapse:这个东西就是展开折叠事件 2.am-collapse(包括其下属 ...

  8. amazeui学习笔记--js插件(UI增强2)--按钮交互Button

    amazeui学习笔记--js插件(UI增强2)--按钮交互Button 一.总结 1.按钮loading状态: <button type="button" class=&q ...

  9. Angular 5.x 学习笔记(1) - 模板语法

    Angular 5.x Template Syntax Learn Note Angular 5.x 模板语法学习笔记 标签(空格分隔): Angular Note on github.com 上手 ...

随机推荐

  1. Npoi导入导出Excel操作

    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...

  2. Like与Instr模糊查询性能

    项目中用到like模糊查询,但是总觉的太小家子气,有没有高逼格的呢? instr(title,'手册')>0 相当于 title like '%手册%' instr(title,'手册')=1 ...

  3. Solr的主界面加登录权限

    如题:效果如下图zu 只需两步: 1.tomcat-users.xml   下添加 <user username="admin" password="new-pas ...

  4. linuxmint 17没有vim

    首先上软件管理器中安装vim,之后配置.vimrc文件 下面是从网上摘抄的配置文件: """""""""&qu ...

  5. 微信小程序想要的是无法监测的流量dark social

    “微信小程序”将带来什么样的变化?就单单的是一个超级Web app?还是只是为了给大家手机节省一些空间?腾讯想要的是高达70%以上的“无法监测的巨大流量”,称之为“dark social”(暗社交). ...

  6. 学习 opencv---(1) opencv3.1.0 组件结构浅析

    本系列是根据 浅墨大神 的opencv系列而写的,,应该大部分内容会一样..如有侵权还请告知........... 开发环境:win7 + VS2013 + opencv3.1.0 至于OpenCV组 ...

  7. 面向对象(五)super

    super方法只是为了执行继承父级的init方法,若要详细,请参考别人的博客 class a(object): def __init__(self): print("aINIT") ...

  8. poj 2503(字符串)

    http://poj.org/problem?id=2503 题意:就是翻译,给你一个字典,然后再查找单词,找得到的就输出单词,找不到的输出eh,用Map水题一个,但这个题有点意思的就是输入的问题 # ...

  9. layer使用方法

    type - 基本层类型 类型:Number,默认:0 layer提供了5种层类型.可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层). 若你采用layer. ...

  10. LeetCode 118 Pascal's Triangle

    Problem: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows  ...