mako模板学习笔记

 

前面已经转过一篇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(https://blog.csdn.net/with%20escaping): ${"there is some text" | u}

html: ${"show <table>"}

html(with escaping): ${"show <table>" | h}

看看输出就明白了

url: there is some text

url(https://blog.csdn.net/with%20escaping): there+is+some+text

html: show <table>

html(with escaping): show &lt;table&gt;

 

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)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值