文档章节

Python模板库Mako的语法(译自官方文档)-- 转载

shaohan
 shaohan
发布于 2014/06/19 16:22
字数 2259
阅读 161
收藏 1
点赞 0
评论 0

Mako模板从一个包含各种类型的内容的文本流解析得到,包括XML、HTML、email文本等。模板还可以包含Mako指令,用来表示变量和表达式替换、控制结构、服务器端注释、整块Python代码,还有用来提供额外功能的各种标签。所有这些结构都被编译为实际的Python代码。这意味着你可以在Mako模板的每个方面都充分利用Python的强大能力。

目录

表达式替换

最简单的表达式是变量替换。语法为 ${} ,这是从Perl、Genshi、JSP EL等得到的启发:

1 this is x: ${x}

上面的例子会把 x 的字符串表示输出到模板的输出流。 x 通常来自于传递给模板渲染函数的 Context 。如果没有传入 x 给模板,并且也没有本地赋值,那么就等于一个特殊的值 UNDEFINED 。

${} 标签中的内容由Python直接计算,因此也可以使用完整的表达式:

1 pythagorean theorem:  ${pow(x,2) + pow(y,2)}

表达式的结果都会在输出到输出流之前转换为字符串形式。

表达式转义

Mako有一组内建的转义机制,包括HTML、URI和XML转义,还有空白截断函数。这些转义可以用 | 操作添加到表达式替换:

1 ${"this is some text" | u}

上面将URL转义应用到表达式上,生成 this+is+some+text 。 u 表示URL转义, h 表示HTML转义, x 表示XML转义, trim 为空白截断函数。

更多有关内建的过滤函数,包括如何编写自己的过滤函数,见 Filtering and Buffering

控制结构

控制结构指用来控制程序流的那些东西——条件(即 if/else )、循环(如 while 和 for )、还有 try/except 等。Mako中,控制结构写成 % 标记后面跟正常的Python控制表达式,用 % 加标签 end<name> 结束, <name> 为表达式的关键词:

1 % if x==5:2     this is some output3 % endif

% 可以放在前面没有文本的行的任何地方,并且缩进是不敏感的。Python所有的“冒号”表达式都可以使用,包括 if/elif/else 、 while 、 for ,甚至是 def ,不过对 def Mako有更好的内建标签。

 1 % for a in ['one', 'two', 'three', 'four', 'five']: 2 % if a[0] == 't': 3     its two or three 4 % elif a[0] == 'f': 5     four/five 6 % else: 7     one 8 % endif 9 % endfor

% 符号也可以被转义,如果你想在行首使用百分比符号,可以用 %% 来转义:

1 %% some text2 3 %% some more text

循环上下文

循环上下文提供 % for 结构中的循环的额外信息:

1 <ul> 2 % for a in ("one", "two", "three"): 3 <li>Item ${loop.index}: ${a}</li> 4 % endfor 5 </ul>

参考 The Loop Context

注释

有两种形式的注释。单行注释在行首使用 ## :

1 ## this is a comment.2 ...text ...

多行注释通过 <%doc> ...text... </%doc>

1 <%doc>2     these are comments3     more comments4 </%doc>

新行过滤器

行末的 \ 字符可以将下一行连接到当前行:

1 here is a line that goes onto \2 another line.

上面的文本等价于:

1 here is a line that goes onto another line.

Python代码块

可以用 <% %> 标签引入任意Python代码块:

1 this is a template2 <% 3 x = db.get_resource('foo') 4 y = [z.element for z in x if x.frobnizzle==5] 5 %> 6 % for elem in y:7     element: ${elem} 8 % endfor

在 <% %> 里面,可以写普通的Python代码块。代码的整体缩进不受限制,Mako编译器会根据生成的Python代码进行调节。

模块级的块

<% %> 的一个变种是模块级的块,用 <%! %> 表示。标签中的代码在模板的模块级别执行,而不是在模板的渲染函数中。因此,这些代码不能访问模板的上下文,并且只能在模板加载到内存时执行(一般每个应用一次,取决于运行环境)。使用 <%! %> 标签来声明模板的导入和纯Python函数:

1 <%! 2 import mylib 3 import re 4 5 def filter(text): 6 return re.sub(r'^@', '', text) 7 %>

可以在模板中的任何位置声明任意数量的 <%! %> 块。它们将按出现的顺序生成为一个单独的模块代码块,放在所有渲染调用之前。

标签

Mako提供的其他东西以标签的形式出现。所有标签使用相同的语法,和XML标签类似,但是在标签名之前加上了 % 字符。标签结束方式和XML类似:

1 <%include file="foo.txt"/>2 3 <%def name="foo" buffered="True">4     this is a def5 </%def>

每个标签都有一组属性。有些属性是必需的。很多属性支持运算,这意味着你可以在属性文本中嵌入一个表达式(使用 ${} ):

1 <%include file="/foo/bar/${myfile}.txt"/>

属性是否支持运行时运算取决于标签的类型和它编译到模板的方式。想知道能否添加表达式的最好方法就是试一下!词法分析器会告诉你是否有效。

下面是全部的标签的一个快速总结:

<%page>

该标签定义了模板的一些通用特性,包括缓存参数和模板调用的参数的可选列表。

1 <%page args="x, y, z='default'"/>

也可以定义缓存特性:

1 <%page cached="True" cache_type="memory"/>

目前每个模板只有一个 <%page> 标签生效,其他的会被忽略。以后的版本中这会被改进,但是现在请确保你的模板中只用了一个 <%page> 标签,否则可能得不到你想要的结果。 <%page> 的用途参考 The body() MethodCaching

<%include>

这是和其他模板语言类似的一个标签, %include 接受一个文件参数,调用那个文件的渲染结果:

1 <%include file="header.html"/>2 3     hello world4 5 <%include file="footer.html"/>

它还接受 <%page> 标签的参数,应用到导入的模板上:

1 <%include file="toolbar.html" args="current_section='members', username='ed'"/>

<%def>

%def 标签定义一个Python函数,函数可以在模板的其他位置调用。基本的思想很简单:

1 <%def name="myfunc(x)">2     this is myfunc, x is ${x}3 </%def>4 5 ${myfunc(7)}

%def 标签比Python的 def 强大得多,因为Mako提供了很多额外的功能,比如能够将函数作为模板的“方法”,自动传递当前的 Context ,使用缓冲/过滤/缓存标志,作为参数传递给其他的函数调用。 %def 的全部细节见 Defs and Blocks

<%block>

<%block> 标签和 %def 类似,但它会在根作用域立即执行,而且可以是匿名的:

1 <%block filter="h">2     some <html> stuff.3 </%block>

借鉴了Jinja2的块,有名字的块实现了一种很方便的继承方法:

1 <html> 2 <body> 3 <%block name="header"> 4 <h2><%block name="title"/></h2> 5 </%block> 6 ${self.body()} 7 </body> 8 </html>

块在 Using Blocks 中有介绍,还有 Inheritance

<%namespace>

Mako中的 %namespace 和Python的 import 语句等价。通过它可以访问其他模板的所有的渲染函数和metadata,Python模块,还有本地定义的函数“包”。

1 <%namespace file="functions.html" import="*"/>

%namespace 生成的底层对象是一个 mako.runtime.Namespace 实例。它是模板中的一个核心结构,用来引用模板的特定信息,比如当前的URI、继承结构和其他一些东西。名字空间见 Namespaces

<%inherit>

通过继承可以实现模板的继承链。它和其他模板语言的概念类似。

1 <%inherit file="base.html"/>

当使用 %inherit 标签时,控制首先被传递到继承模板的顶层模板,由它来决定如何处理调用部分。Mako在这部分实现的非常灵活,包括动态继承、内容封装、多态方法调用。参考 Inheritance

<%nsname:defname>

可以通过 <%<namespacename>:<defname>> 来在一个名字空间中自定义一个标签。它的单标签和双标签形式分别对应行内表达式和 <%call> 标签。

1 <%mynamespace:somedef param="some value">2     this is the body3 </%mynamespace:somedef>

如何创建自定义标签,参考 Calling a Def with Embedded Content and/or Other Defs

<%call>

%call 标签是用户定义标签的传统形式,大致和上面的 <%namespacename:defname> 等价。该标签也参考 Calling a Def with Embedded Content and/or Other Defs

<%doc>

%doc 标签处理多行注释:

1 <%doc>2     these are comments3     more comments4 </%doc>

<%text>

该标签使Mako词法分析器跳过该部分的处理,返回整个内容。主要用于写Mako的文档:

1 <%text filter="h">2     heres some fake mako ${syntax}3     <%def name="x()">${x}</%def>4 </%text>

从模板中提前返回

有时你想在模板或 <%def> 方法的中间停止处理,只用当前得到的结果。可以在Python代码块中使用 return 语句来实现。

1 % if not len(records):2     No records found.3     <% return %> 4 % endif

或:

1 <% 2 if not len(records): 3 return 4 %>

http://www.yeolar.com/note/2012/08/28/mako-syntax/

© 著作权归作者所有

共有 人打赏支持
shaohan
粉丝 10
博文 78
码字总数 57889
作品 0
海淀
项目经理
3 个 Python 模板库比较

你的下一个 Python 项目需要一个模板引擎来自动生成 HTML 吗?这有几种选择。 在我的日常工作中,我花费大量的时间将各种来源的数据转化为可读的信息。虽然很多时候这只是电子表格或某种类型...

20% ⋅ 06/05 ⋅ 0

django 1.8 官方文档翻译: 3-5-1 使用Django输出CSV

使用Django输出CSV 这篇文档阐述了如何通过使用Django视图动态输出CSV (Comma Separated Values)。 你可以使用Python CSV 库或者Django的模板系统来达到目的。 使用Python CSV库 Python自带了...

apachecn_飞龙 ⋅ 2015/09/04 ⋅ 0

django 1.8 官方文档翻译: 1-3-1 高级教程:如何编写可重用的应用

高级教程:如何编写可重用的应用 本高级教程上接教程 6。我们将把我们的网页投票转换成一个独立的Python包,这样你可以在其它项目中重用或者分享给其它人。 如果你最近没有完成教程1–6,我们...

apachecn_飞龙 ⋅ 2015/08/29 ⋅ 0

Fedora上使用Python操作MongoDB学习笔记

1. 创建Python虚拟环境 Fedora中已经安装有Python2和Python3,可执行文件的目录在/usr/bin/目录下,其中软连接为 接下来采用Python3来操作MongoDB,因此为不污染原有的系统环境,以及隔离此特...

t_huanghai ⋅ 04/21 ⋅ 0

Python、Lua和Ruby三大语言脚本哪家强?

这三种语言中的哪一种更合适你的项目?很大程度取决于你想达到什么样的目标。作为一书的结尾,在这一节里,我会描述一下它们各自的优点和不足。 Python的优点和不足 Python的优点如下: 1. P...

柯西带你学编程 ⋅ 06/01 ⋅ 0

使用交互式 shell 来增强你的 Python

Python 编程语言已经成为 IT 中使用的最流行的语言之一。成功的一个原因是它可以用来解决各种问题。从网站开发到数据科学、机器学习到任务自动化,Python 生态系统有丰富的框架和库。本文将介...

10% ⋅ 05/19 ⋅ 0

django 1.8 官方文档翻译:6-5-1 Django中的测试

Django中的测试 自动化测试对于现代web开发者来说,是非常实用的除错工具。你可以使用一系列测试– 测试套件 – 来解决或者避免大量问题: 当你编写新代码的时候,你可以使用测试来验证你的代...

apachecn_飞龙 ⋅ 2015/09/15 ⋅ 0

django 1.8 官方文档翻译: 6-1-1 Django 的设置

Django 的设置 Django 的设置文件包含你安装的Django 的所有配置。这页文档解释设置是如何工作以及有哪些设置。 基础 设置文件只是一个Python 模块,带有模块级别的变量。 下面是一些示例设置...

apachecn_飞龙 ⋅ 2015/08/29 ⋅ 0

用mako增强django模板,用法像jsp

用mako增强django模板 django默认的模板功能还可以,但是不能直接用python的语法,mako解决了这个痛点,使得django的模板变得像jsp一样,可以直接使用python的语法做一些事情。 makodjango-m...

duoduo3_69 ⋅ 2014/09/25 ⋅ 5

Python学习你掌握对方法了吗?python自动化

阅读官方文档即可满足日常需求,官方文档有中文翻译,更加方便学习。但这些都是基础的语法和常见的模块,Python学习重要的是模块,快速、高效的开发依赖的是模块的应用,站在前人的肩膀会省时...

老男孩Linux培训 ⋅ 06/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

笔试题之Java基础部分【简】【一】

基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他 1.length、length()和size() length针对...

anlve ⋅ 23分钟前 ⋅ 2

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 47分钟前 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 52分钟前 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 8

Java 开发者不容错过的 12 种高效工具

Java 开发者常常都会想办法如何更快地编写 Java 代码,让编程变得更加轻松。目前,市面上涌现出越来越多的高效编程工具。所以,以下总结了一系列工具列表,其中包含了大多数开发人员已经使用...

jason_kiss ⋅ 昨天 ⋅ 0

Linux下php访问远程ms sqlserver

1、安装freetds(略,安装在/opt/local/freetds 下) 2、cd /path/to/php-5.6.36/ 进入PHP源码目录 3、cd ext/mssql进入MSSQL模块源码目录 4、/opt/php/bin/phpize生成编译配置文件 5、 . ./...

wangxuwei ⋅ 昨天 ⋅ 0

如何成为技术专家

文章来源于 -- 时间的朋友 拥有良好的心态。首先要有空杯心态,用欣赏的眼光发现并学习别人的长处,包括但不限于工具的使用,工作方法,解决问题以及规划未来的能力等。向别人学习的同时要注...

长安一梦 ⋅ 昨天 ⋅ 0

Linux vmstat命令实战详解

vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令...

刘祖鹏 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部