Python模板库Mako的语法

article/2025/9/11 4:57:35

原文链接:http://www.yeolar.com/note/2012/08/28/mako-syntax/

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

目录

表达式替换

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

this is x: ${x}

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

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

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

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

表达式转义

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

${"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> 为表达式的关键词:

% if x==5:
    this is some output
% endif

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

% 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

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

%% some text
%% some more text

循环上下文

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

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

参考 The Loop Context 。

注释

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

## this is a comment.
...text ...

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

<%doc>
    these are comments
    more comments
</%doc>

新行过滤器

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

here is a line that goes onto \
another line.

上面的文本等价于:

here is a line that goes onto another line.

Python代码块

可以用 <% %> 标签引入任意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

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

模块级的块

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

<%!import mylibimport redef filter(text):return re.sub(r'^@', '', text)
%>

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

标签

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

<%include file="foo.txt"/>

<%def name="foo" buffered="True">
    this is a def
</%def>

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

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

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

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

<%page>

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

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

也可以定义缓存特性:

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

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

<%include>

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

<%include file="header.html"/>

    hello world

<%include file="footer.html"/>

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

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

<%def>

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

<%def name="myfunc(x)">
    this is myfunc, x is ${x}
</%def>

${myfunc(7)}

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

<%block>

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

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

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

<html><body><%block name="header"><h2><%block name="title"/></h2></%block>${self.body()}</body>
</html>

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

<%namespace>

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

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

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

<%inherit>

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

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

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

<%nsname:defname>

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

<%mynamespace:somedef param="some value">
    this is the body
</%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 标签处理多行注释:

<%doc>
    these are comments
    more comments
</%doc>

<%text>

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

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

从模板中提前返回

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

% if not len(records):
    No records found.
    <% return %>
% endif

或:

<%if not len(records):return
%>


http://chatgpt.dhexx.cn/article/kxTACmxG.shtml

相关文章

Django mako 的使用(七)

Django mako 的使用 6.6 mako 的使用 6.6 mako 的使用 安装 mako pip install mako 创建子应用 makos python .\manage.py startapp makos 创建 base_render.py 文件 from django.http import HttpResponse from django.template import RequestContext from django.templat…

mako模版库实践

介绍 这几天在编写一个数据驱动测试框架&#xff0c;其中一个核心模块是根据数据输入&#xff0c;自动转换为测试用例代码。测试数据格式固定&#xff0c;对应的用例代码结构也相对稳定。基于此场景&#xff0c;联想到web页面根据数据从template渲染页面&#xff0c;决定使用类…

Django——mako的配置与使用方法

一、前言 mako最大的特点就是允许在HTML中随意书写Python代码&#xff0c;挺起就很心动啊&#xff01;&#xff01; 二、准备阶段 新建一个项目mako_project&#xff0c;再新建一个app叫app&#xff0c;然后安装mako&#xff08;要联网安装&#xff09; pip install mako然…

Xen新特性

4.0 为了增强主机层面的性能和可扩展性&#xff0c;新的Xen 4.0虚拟机管理程序现在横跨主机服务器上的128(之前64 )个物理处理器&#xff0c;最多可以处理1TB的物理主系统内存。在访客环境中&#xff0c;基于Xen 4.0运行的虚拟机现在可以分配给多达128个虚拟处理器/VCPU(不过…

Xen - Networking

Xen - Networking Step 0 : Xen底下的網路架構 Step 1 : 虛擬還是實體 Step 2 : network-bridge Step 3 : network-nat Step 4 : network-route Step 5 : 參考網頁 Step 0 : Xen底下的網路架構 在虛擬化下的環境就屬網路裝置最為複雜難懂,不過模式大致可以畫分成 3 種 1.netw…

Xen虚拟化之一:Xen环境组件详解

Xen是一个开放源代码虚拟机监视器(Virtual Machine Monitor&#xff0c;简称为VMM)&#xff0c;由剑桥大学开发&#xff0c;它致力于实现在单个计算机上运行多达128个有完全功能的操作系统。Xen通过一种叫做半虚拟化(paravirtualization)的技术获得高效能的表现&#xff08;较少…

浅谈Xen和半虚拟化技术

研究生入学的时候&#xff0c;看了一篇论文——《Xen and the art of virtualization》。现在时隔一年&#xff0c;准备对此进行一番整理。下文是我Xen为例的半虚拟化技术的理解&#xff1a; 虚拟机概况 首先从虚拟机说起&#xff0c;虚拟机技术最早由IBM于上世纪六七十年代提…

xen架构

Xen是一个虚拟机监视器&#xff08;Virtual machine monitor&#xff09;&#xff0c;针对X86系列计算机设计&#xff0c;它能够支持多个客户计算机的同时运行&#xff0c;并且能够达到较好的一个性能水平和资源隔离。Xen是一个开放源代码软件&#xff0c;在GNU General Public…

Xen概述

http://my.oschina.net/davehe/blog/94039 1 Xen概述 1.1 简介 Xen是由剑桥大学计算机实验室开发的一个开源项目。是一个直接运行在计算机硬件之上的用以替代操作系统的软件层&#xff0c;它能够在计算机硬件上并发的运行多个客户操作系统&#xff08;Guest OS&#xff…

KVM和Xen虚拟化有什么区别?Xen和KVM优缺点对比

KVM和Xen是两大虚拟化技术&#xff0c;KVM和Xen又是免费开源的管理程序&#xff0c;新手站长网分享虚拟化技术KVM和Xen的区别优势对比&#xff1a; KVM和Xen的区别 KVM&#xff1a;KVM是轻量级的虚拟化管理程序模块&#xff0c;该模块主要来自Linux内核&#xff1b;KVM的虚拟…

Xen与XenServer的区别

说到XenServer&#xff0c;总是离不开Xen&#xff0c;所以我要说他们的区别&#xff0c;得首先从Xen开始说起&#xff01; Xen体系架构 Xen hypervisor体系架构 Xen 的 VMM ( Xen Hypervisor ) 位于操作系统和硬件之间&#xff0c;负责为上层运行的操作系统内核提供虚拟化的硬件…

xen的安装

一、 Xen介绍 : 在虚拟化软件的部份&#xff0c;可分为VMWare、Xen、KVM、VritualBox是较为常见的。在Xen这到自由软件上主要可分为半虚拟化(Para-virtualization) 及全虚拟化 (Full virtualization) 两种&#xff0c;其中半虚拟化主要是透过修改 Linux 核心来达成的虚拟技术。…

虚拟机体验之 Xen 篇 —— 令人脑洞大开的奇异架构

转载于https://www.cnblogs.com/youxia/p/linux022.html#_label0 阅读目录 总结&#xff1a; 这一篇我要体验的虚拟机系统是 Xen。在虚拟机领域&#xff0c;Xen 具有非常高的知名度&#xff0c;其名字经常在各类文章中出现。同时 Xen 也具有非常高的难度&#xff0c;别说玩转…

xen基础

xen结构概述 一个 Xen 虚拟化环境包括一组项目&#xff0c;它们一起工作来提供虚拟化环境&#xff1a;Xen hypervisor&#xff1b;dom0&#xff1b;domain management and control&#xff0c;域的管理和控制&#xff1b;domU PV 客户机&#xff1b;domU HVM 客户机。 它们之间…

Xen 简介

---------------------------------同样来自 IBM ------------------------------------ Xen 是一种类型 1 虚拟机管理程序&#xff0c;它创建系统资源的逻辑池&#xff0c;使许多虚拟机可共享相同的物理资源。 Xen 是一个直接在系统硬件上运行的虚拟机管理程序。Xen 在系统硬…

全面详解Python与Ruby,到底哪款更优秀

今天,我和大家讨论一下是Python开发语言web好还是Ruby开发语言web好,有需要的小伙伴,可以参考一下。对这方面有自己见解的大神,可以交流一下。希望大家可以认真阅读哦! Python 和 Ruby 都是目前用来开发 websites、web-based apps 和 web services 的流行编程语言之一。 …

Ruby入门级示例代码

【实例简介】 针对入门级的新手参考 【实例截图】 目录结构&#xff1a; 文件&#xff1a;590m.com/f/25127180-494436327-f5ef7f&#xff08;访问密码&#xff1a;551685&#xff09; 【核心代码】class ItemController < ApplicationControllerscaffold :itemdef creat…

Ruby基础教程(Day1)—— Ruby初探

前提&#xff1a;自行安装ruby 一、Ruby初探 最常见的方法是使用ruby命令执行&#xff08;在helloruby.rb中输入print("Hello,Ruby.\n")&#xff09; 在命令行输入ruby helloruby.rb irb命令&#xff0c;以交互命令行方式来执行 在控制台执行irb如下图所示 对象 …

RubyPloticus

原文&#xff1a; RubyPloticus ruby 2006年6月19日 Bliki 索引 译注&#xff1a;代码和生成的图片示例可从这里下载。 在最近的帖子“ 评估Ruby”中&#xff0c;我提到一位同事曾在一个Web应用中加入了一些漂亮的数据图表&#xff0c;有人email问我是…

Ruby(一)

Ruby 是一种开源的面向对象程序设计的服务器端脚本语言&#xff0c;可运行于多种平台&#xff0c;如 Windows、MAC OS 和 UNIX 的各种版本。Ruby流行起来的根本原因是因为基于Ruby的Web开发框架Rails的广泛使。 1、ruby环境 windows&#xff1a;Downloads (rubyinstaller.org…