Python的Mustache
项目描述
Pystache 是 Mustache 的 Python 实现。Mustache 是一个与框架无关、无逻辑的模板系统,灵感来自 ctemplate 和 et。像 ctemplate 一样,Mustache “强调逻辑与展示的分离:在这个模板语言中无法嵌入应用逻辑。”
mustache(5) 手册页提供了 Mustache 语法的好介绍。关于 Mustache 行为的更完整(且更最新)的描述,请参阅官方的 Mustache 规范。
Pystache 是 语义化版本化 的,可以在 PyPI 上找到。这个版本的 Pystache 通过了规范 1.1.2 中所有的测试。
标志: David Phillips
需求
Pystache 使用以下进行测试–
Python 2.4(需要 simplejson 版本 2.0.9 或更早版本)
Python 2.5(需要 simplejson)
Python 2.6
Python 2.7
Python 3.1
Python 3.2
仅需要 JSON 支持用于命令行界面和运行规范测试。对于早期版本的 Python,我们要求 simplejson,因为 Python 的 json 模块是在 Python 2.6 中添加的。
对于Python 2.4,我们需要安装simplejson的早期版本,因为simplejson在2.1.0版本后停止官方支持Python 2.4。simplejson的早期版本可以手动安装,如下所示:
pip install 'simplejson<2.1.0'
安装
pip install pystache pystache-test
要从源代码安装和测试(例如,从GitHub),请参阅开发部分。
使用
>>> import pystache >>> print pystache.render('Hi {{person}}!', {'person': 'Mom'}) Hi Mom!
您还可以创建专用视图类来存储您的视图逻辑。
这是您的视图类(在examples/readme.py中):
class SayHello(object): def to(self): return "Pizza"
如下所示
>>> from pystache.tests.examples.readme import SayHello >>> hello = SayHello()
然后是您的模板,say_hello.mustache(默认情况下,位于类定义所在的同一目录中)
Hello, {{to}}!
整合
>>> renderer = pystache.Renderer() >>> print renderer.render(hello) Hello, Pizza!
为了更好地控制渲染(例如,指定自定义模板目录),请直接使用Renderer类。可以向类的构造函数传递属性或在实例上设置它们。为了按视图定制模板加载,继承TemplateSpec。有关更多信息,请参阅Renderer类和TemplateSpec类的文档字符串。
Python 3
Pystache从0.5.1版本开始支持Python 3。Pystache在Python 2和3之间的行为略有不同,如下所示:
在Python 2中,默认的html-escape函数cgi.escape()不会转义单引号;而在Python 3中,默认的escape函数html.escape()会转义单引号。
在Python 2和3中,字符串和文件编码默认为sys.getdefaultencoding()。然而,这个函数在不同的Python 2和3中可能会返回不同的值,即使它们在同一个系统上运行。检查您自己的系统以确定其行为,或者通过显式传递编码(例如,到Renderer类)来不依赖于默认值。
Unicode
本节描述了Pystache如何处理unicode、字符串和编码。
在内部,Pystache仅使用unicode字符串(Python 3中的str和Python 2中的unicode)。对于输入,Pystache接受unicode字符串和字节字符串(Python 3中的bytes和Python 2中的str)。对于输出,Pystache的模板渲染方法仅返回unicode。
Pystache的Renderer类支持多个属性来控制Pystache如何在输入时将字节字符串转换为unicode。这些属性包括file_encoding、string_encoding和decode_errors。
file_encoding属性是渲染器用于将文件系统读取的任何文件转换为unicode的编码。同样,string_encoding是渲染器用于将渲染过程中遇到的任何其他字节字符串转换为unicode的编码(例如,编码为字节字符串的上下文值)。
decode_errors属性是渲染器传递给Python内置的unicode解码函数(Python 3中的str()和Python 2中的unicode())的错误参数。此参数的有效值是strict、ignore和replace。
这些属性可以通过具有相同名称的关键字参数通过Renderer类的构造函数设置。有关更多信息,请参阅Renderer类的文档字符串。此外,可以通过继承TemplateSpec类在每个视图的基础上控制file_encoding属性。如果没有明确指定,这些属性默认为Pystache的defaults模块中设置的值。
开发
要测试源代码分发(不安装)-
python test_pystache.py
为了测试Pystache与多个版本的Python(只需一个命令即可!),你可以使用tox
pip install tox tox
如果你没有在tox.ini中列出所有Python版本——
tox -e py26,py32 # for example
源代码分布的测试还包括doctests和Mustache规范的测试。要将Mustache规范的测试包含在你的测试运行中
git submodule init git submodule update
如果存在PyYAML,测试工具会解析规范的(更易于阅读的)yaml文件。否则,它会解析json文件。要安装PyYAML——
pip install pyyaml
要运行测试子集,你可以使用nose
pip install nose nosetests --tests pystache/tests/test_context.py:GetValueTests.test_dictionary__key_present
使用Python 3从源代码运行Pystache。 Pystache是用Python 2编写的,必须在Python 3下运行之前用2to3进行转换。安装过程(和tox)会自动进行此转换。
当使用Python 3从源代码分发中导入pystache时,请确保您是从包含转换版本的目录导入(例如,在手动安装后从您的site-packages目录中导入)而不是从原始源代码目录中导入。否则,您将得到语法错误。您可以通过不在导入Pystache时从项目目录运行Python IDE来帮助确保这一点。
邮件列表
有一个邮件列表。请注意,从发布消息到在邮件列表存档中看到它之间会有一些延迟。
历史
0.5.2 (2012-05-03)
增加了对点符号表示法的支持,以及规范的1.1.2版本(问题#99)。[rbp]
缺失的部分现在按照最新的规范版本渲染为空字符串(问题#115)。
错误修复:现在使用str()将假值强制转换为字符串。
错误修复:部分lambda返回值不再推送到上下文堆栈中(问题#113)。
错误修复:部分的lambda列表没有渲染(问题#114)。
0.5.1 (2012-04-24)
增加了对Python 3.1和3.2的支持。
增加了tox支持以测试多个Python版本。
增加了测试脚本入口点:pystache-test。
增加了__version__包属性。
测试工具现在支持Mustache规范的YAML和JSON形式。
测试工具不再需要nose。
0.5.0 (2012-04-03)
此版本代表了对代码库的全面重写和重构,同时添加了功能并修复了许多错误。所有功能以及几乎所有单元测试都已保留。但是,API已进行了某些向后不兼容的更改。
以下是更改的一些选择(不完整)。
亮点
Pystache现在通过Mustache规范的1.0.3版本的所有测试。[pvande]
已移除View类:现在不需要从View或任何其他类继承来创建视图。
用Renderer类替换了Template:可以通过Renderer构造函数或通过设置Renderer实例的属性来修改模板渲染行为。
增加了TemplateSpec类:可以通过从TemplateSpec继承来指定每个视图的模板渲染。
引入了关注点的分离并消除了循环依赖(例如,Template和View类之间的循环依赖,参看问题#13)。
在整个渲染过程中始终使用Unicode。
扩展了测试覆盖率:nosetests现在运行doctests和来自Mustache规范的约105个测试用例(将测试数量从56个增加到约315个)。
添加了一个基本的基准测试脚本,以衡量重构时的性能。
增加了广泛的文档(例如,文档字符串)。
其他更改
添加了命令行界面。[vrde]
主渲染类现在可以接受自定义的部分加载器(例如,字典)和自定义的转义函数。
在渲染时现在支持str字符串中的非ascii字符。
为解码到unicode添加了字符串编码、文件编码和错误选项。
删除了输出编码选项。
删除了对markupsafe的使用。
错误修复
上下文值不再被处理为模板字符串。[jakearchibald]
根据规范,现在不再修改部分周围的空白。[heliodor]
当使用PyPy时,现在正确渲染了零。[alex]
现在允许使用多行注释。[fczuardi]
现在支持无扩展名的模板文件。
将**kwargs传递给Template()不再修改上下文。
将**kwargs传递给无上下文的Template()不再引发异常。
0.4.1 (2012-03-25)
添加了对Python 2.4的支持。[wangtz, jvantuyl]
0.4.0 (2011-01-12)
添加了对嵌套上下文(在模板和视图中)的支持
添加了对倒置列表的支持
解耦模板加载
0.3.1 (2010-05-07)
修复包
0.3.0 (2010-05-03)
View.template_path现在可以包含路径列表
将{{& blah}}作为{{{ blah }}}的别名。
高阶部分
倒置部分
0.2.0 (2010-02-15)
错误修复:返回False或None的方法不会被渲染
错误修复:当标签的值是0时,不会渲染空字符串。[enaeseth]
添加了对将非可调用对象用作View属性的支持。[joshthecoder]
允许将View实例用作属性。[joshthecoder]
支持Unicode和非ASCII编码的字节串输出。[enaeseth]
模板文件编码感知。[enaeseth]
0.1.1 (2009-11-13)
确保我们始终在处理字符串
可以通过直接执行测试文件来运行测试
0.1.0 (2009-11-12)
第一个版本
许可证
版权(C)2012 Chris Jerdonek。保留所有权利。版权(c)2009 Chris Wanstrath
特此授予任何获得本软件及其相关文档副本(“软件”)的人免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向提供软件的人提供使用软件的权利,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些责任是基于合同、侵权或其他方式,这些责任源于、因之而产生或与软件或其使用或其它方式有关。