学习tornado:模板
第一次接触tornado的template,是在做oastub的时候,因为一位同学在handler里面硬编码了html代码,我决定引入template机制来降低逻辑与页面的耦合。
简介
tornado自带了一个简易的template引擎,使用它,我们可以很方便的构建自己的web页面。tornado的template使用起来很简单,如下:
from tornado.template import Template
t = Template("<html>{{ myvalue }}</html>")
t.generate(myvalue="Hello World")
#output: <html>Hello World</html>
可以看到,tornado的template很容易理解,我们加载一段模板代码,tornado会将该代码编译成python code。具体的过程如下:
- 解析template,生成code string
- 使用compile编译成code object
- 使用exec执行该code object
expression
上面的例子,我们可以看到,在template里面myvalue的值是在generate的时候传入并生成的。tornado通过{{ }}将python的值插入模板里面。也就是说,我们可以在双括号里面写上任何python表达式,tornado在模板生成的时候会计算表达式的值,并插入输出代码里面。如下:
Template("{{ 1 + 1 }}").generate()
# output: 2
Template("{{ Hello World }}").generate()
# output: hello world
Template("{{ [ i for i in range(10) ] }}").generate()
# output: '[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
control flow
不光支持表达式,tornado的template还可以通过{{% %}}来支持流程控制。tornado template支持的control有if,for,while和try,如下:
Template("{{% if a is 1 %}} Hello World {{% end %}}").generate(a = 1)
# output: ' Hello World '
Template("{{% if a is 1 %}} Hello World {{% end %}}").generate(a = 2)
# output: ' '
Template("{{% for name in names %}} {{ name }} {{% end %}}").generate(names = ['a', 'b', 'c'])
# output: ' a b c '
export function
除了表达式和流程控制,tornado还给template提供了很多导出函数,可以在template里面直接使用,譬如最常使用的escape等,同时,我们还可以将函数传递给template,如下:
Template("{{ escape(url) }}").generate(url = 'a=1&b=2')
# output: 'a=1&amp;b=2'
Template("{{ l(data) }}").generate(data = [1,2,3], l = lambda data: [ 2 * d for d in data ])
# output: '[2, 4, 6]'
inheritance
tornado的template支持继承,也就是说,我们可以通过继承一个基本的模板,然后再在子模板里面定制需要的东西。这个就跟c++里面多态一样。很是强大。
tornado的template通过extends和block来进行模板的继承。
#定义一个基本模板 main.html
<header>
{{% block header %}}{{% end %}}
</header>
#定义子模板 index.html
{{% extends main.html %}}}
{{% block header %}} <h1>Hello world!</h1>
{{% end %}}
可以看到,template的继承很简单,我们在base模板里面定义整体的模板框架,使用block字段来标明子模板可以重载。子模板通过extends载入base模板,然后使用block来定制自己的功能。
UIModule
从上面可以看到,tornado的template虽然简单,但是却很强大,不光如此,tornado还提供了UIModule,让我们更强大的去定制自己的html页面。在编写不同的web页面的时候,有时候我们需要重用一些html代码,这种情况不适用extends和block,如果以c++对比,extends和block就如同类的继承,是类的复用,而我们这里则需要实现的是函数级别的复用。
幸运的是,tornado的UIModule提供了这种功能,我们首先继承UIModule,然后将其注册给application,这样模板就能使用这个UIModule了,如下:
class HelloModule(tornado.web.UIModule):
def render(self):
return '<h1>Hello, world!</h1>'
app = tornado.web.Application(
ui_modules={'Hello', HelloModule}
)
#我们注册了一个Hello的UIModule,这样template就可以使用了,index.html
<html>
<body>
{{% module Hello() %}}
</body>
</html>
可以看出,uimodule的使用也很简单,更强大的是,我们可以在uimodule里面嵌入自己的css,javascript等。只需要重载继承的embedded_javascript,embedded_css等,这里就不展开了。
后面的话
tornado的template是一个很强大的模块,使用它,我们可以快速构建web应用,不过,我们仍然可以使用其他的模板引擎来与tornado集成,这里不得不说tornado的强大。
学习tornado:模板的更多相关文章
- Tornado模板
--------------------静态文件-------------------- 1.static_path:通过向web.Application类的构造函数传递一个名为static_path ...
- Python学习---django模板语法180122
django模板语法[Template] 模版的组成: HTML代码+逻辑控制代码 <h1> {{ user_name }} </h1> 逻辑控制代码的组成: 1.变量: ...
- 第一次学习tornado小练习
内容 这次是python的一个web框架,tornado,这个web框架在python的几个web框架中一个比较简单的web框架,刚开始接触python的时候就知道python有两个比较常用的web框 ...
- Tornado模板配置
#!/usr/bin/env python # -*- coding:utf-8 -*- #tornado模板配置 import tornado.ioloop import tornado.web c ...
- opengl学习-利用模板测试勾画物体轮廓中出现的一个问题
我在学习OpenGL模板测试勾画物体轮廓的时候,出现了这个问题: 这个出现的原因就是,改变摄像机的时候,每次绘制,上次绘制中模板缓冲区的数据没有清除的原因.也就是在while循环开始的时候,glCle ...
- Knockout学习之模板绑定器
模板绑定器 如今页面结构越来越复杂,仅仅依靠foreach已经不足以我们的使用,这个时候我们就需要模板的存在,模板的优点自然很多,首先会让页面整洁,同时修改起来也可以方面的定位,最重要的是ko可以条件 ...
- ###STL学习--标准模板库
下面进行STL的学习.希望能了解标准模板库中的常用容器,迭代器,可以自由运用STL以提高编写代码的效率.下面的内容我想以知识点为总结,不再像<Effective C++>那样以章节进行总结 ...
- Tornado 模板支持“控制语句”和“表达语句”的表现形式
Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的 例如 {% if len(items) > 2 %}.表达语句是使用 {{ 和 }} 包起来的,例 ...
- [Flask]学习杂记--模板
这个学习杂记主要不是分享经验,更多是记录下falsk的体验过程,以后做东西在深入研究,因为django之前用的时间比较长,所以很多概念都是一看而过,做个试验了解下flask的功能. flask中使用是 ...
随机推荐
- VMWare 虚拟机 共享文件夹
1.不能拷贝和直接拖拽文件至虚拟机系统中 解决办法: 通过共享文件夹的方式进行文件共享. (Win7 32位 10.0版本的虚拟机). ①:选择虚拟机 虚拟机 → 设置 如下图: ②: ...
- FJUT寒假作业第二周C题解(位运算)
题目来源:http://210.34.193.66:8080/vj/Contest.jsp?cid=161#P2 题意比较好理解.如果直接按题目要求一步一解.一定超时.作为一个懒人也不会这么暴力一个肯 ...
- 使用WeihanLi.Redis操作Redis
WeihanLi.Redis Intro StackExchange.Redis 扩展,更简单的泛型操作,并提供一些的适用于业务场景中的扩展 基于 Redis 的五种数据类型扩展出了一些应用: Str ...
- Spring之ORM模块
ORM模块对Hibernate.JDO.TopLinkiBatis等ORM框架提供支持 ORM模块依赖于dom4j.jar.antlr.jar等包 在Spring里,Hibernate的资源要交给Sp ...
- 你知道如何为iOS工程改名吗?
我们在iOS开发中,难免会遇到项目做到一半要改名字的情况.如果项目名差的太大,工程名看起来总是不舒服的,有良心的开发者可能就会想着为工程改个贴切的名字,那么你就为用到本文记录的内容. 如果我们开发的两 ...
- 使用MD5SUM检查文件
有不少网站提供下载文件的同时,提供了文件的MD5SUM的值.如何检查自己下载的文件与原文件一样呢?用md5sum的-c选项. 操作如下: 1.先新建一个文本文件,写入网站上提供的md5sum的值,空两 ...
- 指令汇C电子市场开发(一) ActionBar的使用
前话: 在学习开发谷歌电子市场的的时候,我换了一款比较高大上的模拟器--genymotion,首先去genymotion的官网注册下载,然后安装.感觉这款模拟器运行挺快的,哈哈,而且可以直接把应用拖进 ...
- antlr v4 使用指南连载2——准备环境
antlr v4 开发环境 从上一篇文章的例子中可以知道,antlr有一套自己的语法来声明目标语言的语法,因此它本身就需要编译或者使用antlr提供的api来读取这些语法规则,并使之可 ...
- 【Unity Shaders】Shader中的光照
写在前面 自己写过Vertex & Fragment Shader的童鞋,大概都会对Unity的光照痛恨不已.当然,我相信这是因为我们写得少...不过这也是由于官方文档对这方面介绍很少的缘故, ...
- 如何在mac OS X中查看Emoji表情的含义
使用ctrl+空格,在搜索框中搜索 TextEdit程序,其实中文是 文本编辑 程序, 运行,在菜单中选择 编辑->特殊字符 然后可以看到每个图标的说明啦