50

我没有找到 jinja2 和 Mako 的一个很好的比较。你会用什么来完成什么任务?

我个人对 mako(在 pylons 网络应用程序上下文中)感到满意,但我很想知道 jinja2 是否有一些 mako 没有的不错的功能/改进?- 或者可能是缺点? -

4

2 回答 2

44

我个人更喜欢 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 的宏(实际上是整个语言)看起来更像是 Mako 所做的 Python!

于 2010-08-08T21:14:15.907 回答
7

看一下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

它针对性能进行了优化(更多herehere),经过良好测试记录

于 2013-04-12T10:58:22.933 回答