tornado 学习笔记8 模板以及UI
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的更多相关文章
- tornado 学习笔记1 引言
从事软件开发这行业也快5年啦,其实从事的工作也不完全是软件开发,软件开发只是我工作中的一部分.其中包括课题研究.信息化方案设计.软件开发.信息系统监理.项目管理等工作,比较杂乱.开发的软件比较多,但是 ...
- OpenCV 学习笔记(模板匹配)
OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...
- Python Flask学习笔记之模板
Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...
- Tornado学习笔记(一) helloword/多进程/启动参数
前言 当你觉得你过得很舒服的时候,你肯定没有在进步.所以我想学习新的东西,然后选择了Tornado.因为我觉得Tornado更匹配目前的我的综合素质. Tornado学习笔记系列主要参考<int ...
- amazeui学习笔记--js插件(UI增强)--警告框Alert
amazeui学习笔记--js插件(UI增强)--警告框Alert 一.总结 1.警告框基本样式:用am-alert声明div容器, <div class="am-alert" ...
- amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown
amazeui学习笔记--js插件(UI增强4)--下拉组件Dropdown 一.总结 1.am-dropdown(及其孩子):控制下拉列表的样式 2.data-am-dropdown(及其孩子):控 ...
- amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse
amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse 一.总结 注意点: 1.data-am-collapse:这个东西就是展开折叠事件 2.am-collapse(包括其下属 ...
- amazeui学习笔记--js插件(UI增强2)--按钮交互Button
amazeui学习笔记--js插件(UI增强2)--按钮交互Button 一.总结 1.按钮loading状态: <button type="button" class=&q ...
- Angular 5.x 学习笔记(1) - 模板语法
Angular 5.x Template Syntax Learn Note Angular 5.x 模板语法学习笔记 标签(空格分隔): Angular Note on github.com 上手 ...
随机推荐
- 给网页 title添加图片。
在网页的title中添加 <link rel="shortcut icon" href="logo.png" /> 即可. 可以看下百度搜索的代码, ...
- css之display:inline-block
display:inline-block: 作用:将对象呈现为inline对象,但是对象的内容作为block对象呈现.之后的内联对象会被排列在同一行内.比如我们可以给一个link(a元素)inline ...
- service和serviceImpl的选择
同行中,有些同行公司的代码风格是service层=service接口+serviceImpl实现类: 而有的同行公司的代码风格是service层=service类: 为什么不一样呢? 以前没想过这个问 ...
- eclipse android工程没有错却出现红叉
[转]eclipse android工程没有错却出现红叉 问题描述: 这是一个很变态的问题,花了我N多时间才解决掉,而且弄得心情非常郁闷,这明显是ADT的bug嘛,为什么最新的版本还没有解决? 将Li ...
- 知识联结梳理 : I/O多路复用、EPOLL(SELECT/POLL)、NIO、Event-driven、Reactor模式
为了形成一个完整清晰的认识,将概念和关系梳理出来,把坑填平. I/O多路复用 I/O多路复用主要解决传统I/O单线程阻塞的问题.它通过单线程管理多个FD,当监听的FD有状态变化的时候的,调用回调函数, ...
- 【HNOI2008】Cards BZOJ 1004
Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目 前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张 ...
- POI导出excel日期格式
参考帖子: [1]http://www.ithao123.cn/content-2028409.html [2]http://javacrazyer.iteye.com/blog/894850 再读本 ...
- js 的复制和引用 (传值和传址)
复制(传值-实参): 基本类型赋值.函数参数 引用(传址-形参): 对象.数组.函数
- js框架设计1.2对象扩展笔记
需要一个新的功能添加到我们的命名空间上.这方法在JS中被叫做extend或者mixin,若是遍历属性用一下1.1代码,则会遍历不出原型方法,所以1.2介绍的是mass Framework里的mix方法 ...
- Unity3D NGUI刮刮卡效果
线上效果 确保你的纹理的read/write 是勾选的,纹理格式是 RGBA32的 //代码 using UnityEngine; [RequireComponent(typeof(UITexture ...