Eurasia/使用标准模板
查看全部词条命名空间:Main
使用标准模板
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()