Mako还是Jinja2?

51 投票
2 回答
39357 浏览
提问于 2025-04-16 02:30

我没有找到关于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!

撰写回答