Mako还是Jinja2?
我没有找到关于jinja2和Mako的好比较。你会在什么任务中使用它们呢?
我个人在使用Mako(在pylons的网页应用中)时很满意,但我很好奇jinja2是否有一些Mako没有的好功能或改进?或者说,可能有什么缺点呢?
2 个回答
9
看看这个 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
49
我个人更喜欢Jinja2的语法,而不是Mako的。来看一下这个来自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的例子可读性高得多。Jinja2的结构更规律,标签的开始和结束方式是可预测的,处理和控制指令用{% %}
,输出变量用{{ }}
。
不过这些都是个人喜好。我不知道有什么更重要的理由让你选择Jinja2而不是Mako,反之亦然。而且Pylons足够优秀,你可以使用任意一种!
更新提到了Jinja2的宏。虽然在任何情况下都显得有些牵强,但在我看来,Jinja2的例子更容易阅读和理解。Mako的指导理念是“Python是个很棒的脚本语言。别重复造轮子……你的模板可以处理这些!”但Jinja2的宏(实际上是整个语言)看起来更像Python,而不是Mako!