一直使用Jinja2,前段时间听说mako,一试
大同小异,天下模板都差不多
要写代码测试,文档先行
资源
官网 http://www.makotemplates.org/
文档 http://docs.makotemplates.org/en/latest/
文档翻译 Mako模板入门 http://help.42qu.com/code/mako.html
安装
1 |
pip install mako |
HelloWorld
1 2 3 4 5 6 7 8 9 |
from mako.template import Template mytemplate = Template("hello world!") print mytemplate.render() ------------------------- from mako.template import Template print Template("hello ${data}!").render(data="world") |
语法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
输出变量 ${x} 数学计算 ${1+1} the contents within the ${} tag are evaluated by Python directly, so full expressions are OK filter ${"test"|u} ${"test"|u,trim} 内置filter列表 u : URL escaping, provided by urllib.quote_plus(string.encode('utf-8')) h : HTML escaping, provided by markupsafe.escape(string) x : XML escaping trim : whitespace trimming, provided by string.strip() entity : produces HTML entity references for applicable strings, derived from htmlentitydefs unicode (str on Python 3): produces a Python unicode string (this function is applied by default) decode. : decode input into a Python unicode with the specified encoding n : disable all default filtering; only filters specified in the local expression tag will be applied. 分支 % if x == 5: abcd % endif 循环 % for a in ['1', '2', '3']: % if a == '1': abc % elif a == '2': def % else: gh % endif $ endfor Python语法 this is a template x = db.get_resource('foo') y = [z.element for z in x if x.frobnizzle==5] %> % for elem in y: element: ${elem} % endfor 换行 加 / 强制不换行 |
注释
1 2 3 4 5 6 7 8 9 |
## 这是一个注释. ...text ... 多行 %doc> 这里是注释 更多注释 /%doc> |
模块级别语句
的一个变体是 ,代表模块级别的代码块。其中的代码会在模板的模块级别执行,而不是在模板的 rendering 函数中。
1 2 3 4 5 6 7 |
! import mylib import re def filter(text): return re.sub(r'^@', '', text) %> |
标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
定义了当前模板的总体特性,包括缓存参数,以及模板被调用时期待的参数列表(非必须) page args="x, y, z='default'"/> page cached="True" cache_type="memory"/> include file="header.html"/> hello world include file="footer.html"/> %def 标签用于定义包含一系列内容的一个 Python 函数,此函数在当前模板的其他某个地方被调用到 def name="myfunc(x)"> this is myfunc, x is ${x} %def> ${myfunc(7)} block filter="h"> some html> stuff. %block> block name="header"> h2>block name="title"/>h2> %block> Mako 中的 %namespace 等价于 Python 里的 import 语句。它允许访问其他模板文件的所有 rendering 函数和元数据 namespace file="functions.html" import="*"/> inherit file="base.html"/> 处理多行注释: doc> these are comments more comments %doc> 该标签使得 Mako 的词法器对模板指令的常规解析动作停止,并以纯文本的形式返回其整个内容部分 text filter="h"> heres some fake mako ${syntax} def name="x()">${x}%def> %text> |
有时你想中途停止执行一个模板或者 方法,只返回已经收集到的文本信息,可以通过在 Python 代码块中使用 return 语句来完成
1 2 3 4 5 |
% if not len(records): No records found. return %> % endif |
文件template
为提高性能,从文件中加载的 Template, 可以将它产生的模块的源代码以普通 python 模块文件的形式(.py),
缓存到文件系统中。只要加一个参数 module_directory 即可做到这一点:
1 2 3 4 |
from mako.template import Template mytemplate = Template |