mako模板学习笔记
2010-01-29 11:27
162 查看
前面已经转过一篇mako模板的调用方法,看了看也挺简单的,这次主要是学习模板的编写语法。之所以选择mako模板,除了它的口碑好之外,主要是我受不了web.py自带模板了,特别是控制结构那里,没有使用结束标记,非得缩进使用才行,严重影响页面的编排。因为没有搜到有现成的中文教程,就勉强看官方的英文原版了。做个学习记录在此。
Mako语法
mako模板可以是任何文本流形式的文件,HTML、XML都行,当然txt文本也是可以的。不过web.py里面如果使用render_mako的话还是只认HTML的。mako会从中查找变量、函数、定义块等进行执行,而且定义块里面可以直接编写Python代码。嘿嘿,神气得很呐。
1、变量
mako中使用“${}”来定义变量格式,举个例子,在default.html中编写:
显示变量temp的值:${temp}
还算简单了,Django中使用{{}},web.py中直接使用$。${}里面的内容是直接被python执行的,所以呢可以在里面加上更多的操作:
变量temp乘2:${temp*2}
变量temp的平方:${pow(temp,2)}
调用实例,在web.py中定义
class index:
def GET(self):
temp = 10
return render.default(temp=temp)
执行结果:
显示变量temp的值:10
变量temp乘2:20
变量temp的平方:100
2、转义符
在定义变量时,如果其中包含特殊符号时记得要使用转义符转换。u负责转换URL地址,h转换HTML,x对XML进行转义,trim就是去空格啦。
url: ${"there is some text"}
url(with escaping): ${"there is some text" | u}
html: ${"show <table>"}
html(with escaping): ${"show <table>" | h}
看看输出就明白了
url: there is some text
url(with escaping): there+is+some+text
html: show <table>
html(with escaping): show <table>
3、控制结构
mako模板中使用%来定义控制结构,像if、for、try之类的,关键的就是要使用“%end<name>”来关闭控制结构。这个应该很好理解了,上个菜:
% for a in [0,1,2,3,4,5,6,7,8,9]
% if a%2==0
${a}是偶数
% else:
${a}是奇数
% endif
% endfor
显示结果:
0是偶数
1是奇数
2是偶数
3是奇数
4是偶数
5是奇数
6是偶数
7是奇数
8是偶数
9是奇数
4、注释
这个没什么好说的,两个井号##是当行注释,而<%doc>和</%doc>中间可以写多行注释
5、换行过滤
同python代码中一样,可以使用“/”来强制不换行。
测试mako模板中可/
换行否
6、Python代码块
在mako模板中可以直接写py代码,这是个功能很强大的地方,python代码写在<%和%>之间即可。
<%
x = [1,2,3,4,5,6,7,8,9,0]
y = [z for z in x if z%2==0] # 仅选择偶数出来
%>
% for elem in y:
element: ${elem}
% endfor
输出结果:
element: 2
element: 4
element: 6
element: 8
element: 0
7、模块级代码
上面有说可以直接在mako中上一般的python代码,还有更强大的地方,可以在引入模块和定义函数等等,在<%! %>中定义即可。
这个模块级别的代码块是在引入mako模板时直接加载到内存中的,是优先于render定义的。所以并不能直接用来进行页面内容的输出。我个人感觉就是如果使用<%! %>来引入了模块和函数,就相当于在后台code中引入,可以作为发布后修改code的补丁形式。
<%!
import mylib...
import re
def filter(text):
return re.sub(r"^@", "", text)
%>
8、标签
mako模板中其他的一些功能都是通过标签来定义的,定义格式为<%tagname></%tagname>。前面的多行注释<%doc></%doc>就是标签里的一种。
官方文档对每个标签都有详细的描述,特别是像<%def>、<%namespace>、<%inherit>等都有专门的篇章进行介绍的。
<%page> 定义模板的页面信息
<%include> 引入其他文件
<%def> 定义Python函数
<%namespace> 名称空间,有点.NET的感觉
<%inherit> 继承父模板
<%namespacename:defname> 调用其他名称空间中的函数
<%call> 一样的调用函数
<%doc> 前面有了,就是注释
<%text> Doc,类似于Python的三引号。使用filter定义转义(h/u/t)
Mako语法
mako模板可以是任何文本流形式的文件,HTML、XML都行,当然txt文本也是可以的。不过web.py里面如果使用render_mako的话还是只认HTML的。mako会从中查找变量、函数、定义块等进行执行,而且定义块里面可以直接编写Python代码。嘿嘿,神气得很呐。
1、变量
mako中使用“${}”来定义变量格式,举个例子,在default.html中编写:
显示变量temp的值:${temp}
还算简单了,Django中使用{{}},web.py中直接使用$。${}里面的内容是直接被python执行的,所以呢可以在里面加上更多的操作:
变量temp乘2:${temp*2}
变量temp的平方:${pow(temp,2)}
调用实例,在web.py中定义
class index:
def GET(self):
temp = 10
return render.default(temp=temp)
执行结果:
显示变量temp的值:10
变量temp乘2:20
变量temp的平方:100
2、转义符
在定义变量时,如果其中包含特殊符号时记得要使用转义符转换。u负责转换URL地址,h转换HTML,x对XML进行转义,trim就是去空格啦。
url: ${"there is some text"}
url(with escaping): ${"there is some text" | u}
html: ${"show <table>"}
html(with escaping): ${"show <table>" | h}
看看输出就明白了
url: there is some text
url(with escaping): there+is+some+text
html: show <table>
html(with escaping): show <table>
3、控制结构
mako模板中使用%来定义控制结构,像if、for、try之类的,关键的就是要使用“%end<name>”来关闭控制结构。这个应该很好理解了,上个菜:
% for a in [0,1,2,3,4,5,6,7,8,9]
% if a%2==0
${a}是偶数
% else:
${a}是奇数
% endif
% endfor
显示结果:
0是偶数
1是奇数
2是偶数
3是奇数
4是偶数
5是奇数
6是偶数
7是奇数
8是偶数
9是奇数
4、注释
这个没什么好说的,两个井号##是当行注释,而<%doc>和</%doc>中间可以写多行注释
5、换行过滤
同python代码中一样,可以使用“/”来强制不换行。
测试mako模板中可/
换行否
6、Python代码块
在mako模板中可以直接写py代码,这是个功能很强大的地方,python代码写在<%和%>之间即可。
<%
x = [1,2,3,4,5,6,7,8,9,0]
y = [z for z in x if z%2==0] # 仅选择偶数出来
%>
% for elem in y:
element: ${elem}
% endfor
输出结果:
element: 2
element: 4
element: 6
element: 8
element: 0
7、模块级代码
上面有说可以直接在mako中上一般的python代码,还有更强大的地方,可以在引入模块和定义函数等等,在<%! %>中定义即可。
这个模块级别的代码块是在引入mako模板时直接加载到内存中的,是优先于render定义的。所以并不能直接用来进行页面内容的输出。我个人感觉就是如果使用<%! %>来引入了模块和函数,就相当于在后台code中引入,可以作为发布后修改code的补丁形式。
<%!
import mylib...
import re
def filter(text):
return re.sub(r"^@", "", text)
%>
8、标签
mako模板中其他的一些功能都是通过标签来定义的,定义格式为<%tagname></%tagname>。前面的多行注释<%doc></%doc>就是标签里的一种。
官方文档对每个标签都有详细的描述,特别是像<%def>、<%namespace>、<%inherit>等都有专门的篇章进行介绍的。
<%page> 定义模板的页面信息
<%include> 引入其他文件
<%def> 定义Python函数
<%namespace> 名称空间,有点.NET的感觉
<%inherit> 继承父模板
<%namespacename:defname> 调用其他名称空间中的函数
<%call> 一样的调用函数
<%doc> 前面有了,就是注释
<%text> Doc,类似于Python的三引号。使用filter定义转义(h/u/t)
相关文章推荐
- mako模板学习笔记
- [置顶] 模板和学习笔记
- play framework学习笔记之 模板引擎
- Django学习笔记1 [路由机制,数据库orm,模板语言]
- 金庸小说考试之模板方法模式学习笔记[C++版]
- joomla3.4.1学习笔记(一)——后台显示自定义模板
- c++ 模板学习笔记:类模板和函数模板实现pair(权哥)
- Silverlight 自定义控件模板管理 (silverlight 学习笔记)
- C++ Primer 学习笔记_78_模板与泛型编程 -实例化[续]
- C++ Primer 学习笔记_75_模板与泛型编程 --模板定义
- splay学习笔记及模板
- 设计模式学习笔记-模板方法模式
- [学习笔记]设计模式[7]-{模板方法模式}
- php学习笔记(一)php模板与控制器
- 学习 jForum笔记 四ForumAction 发现用户认证模板 .
- php学习笔记(三十五)smarty模板中使用变量的三种方式
- Windows 8 Directx 开发学习笔记(十三)利用模板实现木箱镜像
- 黑马程序员-Java学习笔记之设计模式(单例设计模式,装饰设计模式,模板设计模式)
- 【C++】学习笔记草稿版18(模板)
- laravel学习笔记(5)— Blade模板引擎