我应该使用Mako进行模板吗?
我一直在考虑使用模板解决方案,现在在Mako和Genshi之间犹豫不决。我觉得Genshi的模板有点难看,所以我更倾向于使用Mako。
我开始想:Mako允许嵌入Python代码有什么好处呢?对普通人来说,这有什么方便的地方吗?
难道不可以只用模板,而不需要嵌入Python代码吗?
5 个回答
Genshi 是为了生成 XML 文档而设计的(可以理解为它在这方面有偏向和优化),虽然它也支持生成其他类型的文本文件。Mako 和 Django 模板则是作为一种通用的文本模板系统来设计的。Evoque 也是这样,但有一个根本的不同点,就是它只允许在模板中使用 Python 的 表达式,也就是说不允许使用 Python 的 语句。
这带来的一个重要结果是,Evoque 能够在一个沙盒环境中执行模板评估——也就是说,你可以安全地让不可信的用户对模板的源代码进行写入,这对于那些允许嵌入 Python 语句 的模板引擎来说几乎是不可能做到的。哦,另外,虽然在直接功能比较上没有落后,但在某些情况下,Evoque 实际上比 Mako 更快,而且它也支持 Python 3。
难道只用模板就足够了吗,不需要嵌入Python代码吗?
只有当你的模板语言本身具备足够的逻辑功能,实际上就像是一种脚本语言时,这种情况才成立。那时候,你完全可以直接使用Python。
更复杂的网站通常需要处理复杂的展示逻辑和一些不简单的模板结构,比如在不同的地方或页面重复的部分,以及递归树形结构。如果你的模板语言限制了你的操作,比如认为“在模板中写代码是坏事”,那就会让事情变得很麻烦。
这样一来,你就不得不在Python的业务逻辑中写一些展示辅助函数,这样的做法比一开始的情况更糟糕,因为它把展示和应用逻辑混在了一起。那些因为不信任你而限制你能力的语言,真是让人失望。
根据Mako的主页所说,Mako的优点非常明显:速度快得惊人,语法和功能上对会用Python的人来说非常熟悉。
而Genshi选择了“解释”而不是提前生成Python代码(根据他们的常见问题,这样做是为了让错误信息更清晰),并且在使用Python时保持一定的距离(比如用xpath来选择元素,使用xinclude而不是继承等),所以对于那些不懂Python但对XML很在行的人来说,可能会更自然一些。
那么你的“受众”是谁呢?如果是Python程序员,我建议使用Mako(因为它速度快且容易上手);如果是对Python不太熟悉的XML专家,Genshi可能更合适(因为它与Python保持一定距离,更贴近XML的使用习惯)。
你提到“普通人”,但普通人不懂Python,而且xpath对他来说也是个深奥的谜;如果你的目标真的是这些人,其他模板系统,比如Django的,可能会更适合(可以帮助他们避免出错;-)。