我没有找到jinja2和Mako的很好的比较。你会用什么来完成什么任务?
我个人对-or感到满意(在pylons web应用程序环境中),但我很好奇jinja2是否有一些mako没有的好特性/改进? mako可能有缺点?
发布于 2010-08-09 05:14:16
我个人更喜欢JJAA2的语法而不是Mako的语法。
<%inherit file="base.html"/>
<%
rows = [[v for v in range(0,10)] for row in range(0,10)]
%>
<table>
% for row in rows:
${makerow(row)}
% endfor
</table>
<%def name="makerow(row)">
<tr>
% for name in row:
<td>${name}</td>\
% endfor
</tr>
</%def>
这里有如此多的构造,以至于我必须在开始之前查阅文档。哪些标签以<%
开头,以/>
结尾?其中哪些是允许用%>
关闭的?当我想要输出一个变量(${foo}
)时,为什么还有另一种输入模板语言的方法?这个伪XML是怎么回事,其中一些指令像标签一样接近,并且有属性?
这是Jinja2中的等效示例:
{% extends "base.html" %}
<table>
{% for row in rows %}
{{ makerow(row) }}
{% endfor %}
</table>
{% macro make_row(row) %}
<tr>
{% for name in row %}
<td>{{ name }}</td>
{% endfor %}
</tr>
{% endmacro %}
Jinja2有过滤器,我听说Mako也有,但我还没见过。过滤函数不同于常规函数,它们接受被过滤的值的隐式第一个参数。因此,在Mako中,您可以这样写:
${escape(default(get_name(user), "No Name"))}
太可怕了。在Jinja2中,你可以这样写:
{{ user | get_name | default('No Name') | escape }}
在我看来,Jinja2示例的可读性要好得多。JJIA2更有规则,因为标记以一种可预测的方式开始和结束,要么使用{% %}
处理和控制指令,要么使用{{ }}
输出变量。
但这些都是个人喜好。我不知道还有什么更重要的理由可以选择Jinja2而不是Mako,反之亦然。而Pylons是足够好的,你可以使用其中任何一个!
更新包含Jinja2宏。尽管在任何情况下都是人为设计的,但在我看来,Jinja2示例更容易阅读和理解。Mako的指导思想是"Python是一种很棒的脚本语言,不要重复发明wheel...your模板就可以处理它!“但是JJIA2的宏(实际上是整个语言)看起来更像是Python,而Mako是这样的!
发布于 2013-04-12 18:58:23
看一看wheezy.template示例:
@require(user, items)
Welcome, @user.name!
@if items:
@for i in items:
@i.name: @i.price!s.
@end
@else:
No items found.
@end
它针对性能(更多的here和here)进行了优化,经过了良好的测试和记录。
https://stackoverflow.com/questions/3435972
复制相似问题