Eurasia/使用标准模板
来自站长百科
使用标准模板[ ]
eurasia.template 模块是 Mako 的简化版,带有大部分 Mako 模板的功能,和相同的标签语法。同时也是编译型模板。
template 包涵以下标签语法。
- 表达式替换
this is x: ${x}
进一步,取值表达式可以嵌入 python 代码,并替换为 python 表达式的运算结果:
${int(a) + int(b)}
- 控制结构
我们可以在模板中使用条件表达式及叠代循环表达式。这里是条件表达式:
%if x==1: x is ${x} %elif x==2: x is ${x} %else: x is ${x} %endif
这里是循环:
%for a in ['one', 'two', 'three', 'four', 'five']: %if a[0] == 't': its two or three %elif a[0] == 'f': four/five %else: one %endif %endfor
- python 代码
可以在模板中运行 python 代码:
<% # 这里是 Python 代码 a = 1 b = 2 %> 测试一下 a + b : ${a + b}
第一行(紧跟“<%”之后)的 python 代码的缩进会被忽略,所以请避免使用 def、class、if、for 等依赖缩进的 python 代码。函数中的 python 代码块在当前函数中可见,函数外的代码块在当前模板中全局可见。
- 函数标签 <%def name="..." %>
函数是模板中最基本的调用单位,类似于 Python 中的函数:
<%def name="myfunc(x)"> this is myfunc, x is ${x} </%def> 调用: ${myfunc(7)}
- <%call expr="..."%> 标签
call 标签用于调用 <%def%> 标签,可传递额外的内嵌内容。
<%namespace> 标签[ ]
eurasia 标准模板中没有 Mako 中 <%namespace> 标签的等价物,这个功能相当于 Python 中的 import。
<%namespace> 需要一系列关于导入路径的配置,这比较复杂,因此 eurasia 换了一种方式。
Template 函数第二个参数可以设定模板中可见的环境。你可以在这里预先导入一些模板中用得到的东西,比如宏。
#!/usr/bin/python2.5 #-*- coding: utf-8 -*- from eurasia.template import Template s1 = '''\ # 定义模板宏 <%def name="macros(a, b)"> ${caller.slot1(a)} ${caller.slot2(b)} </%def>''' s2 = '''\ # 调用模板宏 <%def name="main()"> <%call expr="macros(1, 2)"> <%def name="slot1(a)"> slot1, ${a} </%def> <%def name="slot2(b)"> slot1, ${b} </%def> </%call> </%def>''' tmpl1 = Template(s1) # 使用 env 参数指定模板环境 tmpl2 = Template(s2, env={'macros': tmpl1.macros}) tmpl2.main()