Mako或Jinja2?

ych*_*che 47 python templates template-engine mako jinja2

我没有找到jinja2和Mako的良好比较.你会用什么来完成什么任务?

我个人很满意mako(在一个pylons网络应用程序环境中),但我很想知道jinja2是否有一些很好的功能/改进mako不? - 或者可能是缺点? -

Jes*_*lon 41

我个人更喜欢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>
Run Code Online (Sandbox Code Playgroud)

这里有很多结构,我甚至可以在开始之前查阅文档.哪个标签开始喜欢<%和关闭/>?哪些被允许关闭%>?当我想输出变量(${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 %}
Run Code Online (Sandbox Code Playgroud)

Jinja2有过滤器,我告诉Mako也有,但我没见过它们.过滤器函数不像常规函数那样,它们采用被过滤值的隐式第一个参数.因此,在Mako你可以写:

${escape(default(get_name(user), "No Name"))}
Run Code Online (Sandbox Code Playgroud)

那太糟了.在Jinja2你会写:

{{ user | get_name | default('No Name') | escape }}
Run Code Online (Sandbox Code Playgroud)

在我看来,Jinja2的例子非常易读.Jinja2更加规则,标签以可预测的方式开始和结束,既可以{% %}用于处理指令,也可以{{ }}用于输出变量.

但这些都是个人喜好.我不知道选择Jinja2超过Mako的另一个重要原因,反之亦然.而且Pylons非常棒,你可以使用它们!

更新包括Jinja2宏.虽然在任何情况下都做了设计,但在我看来,Jinja2的例子更容易阅读和理解.Mako的指导思想是"Python是一种很棒的脚本语言.不要重新发明轮子......你的模板可以处理它!" 但是Jinja2的宏(实际上是整个语言)看起来更像是Mako所做的Python!

  • 你如何比较jinja过滤器和mako过滤器,说它们"更好",但"你还没有看到"mako过滤器?似乎不合理.我们使用几乎与Jinja相同的语法来过滤:`$ {user | get_name,default('No Name'),escape}`.很明显你从来没有使用过完全没问题的Mako,但你几乎无法进行合理的比较,或者称我们的语法为"愚蠢",谢谢! (48认同)
  • 不太公平:你的"Jinja中的等价物"排除了Mako例子中的一半,因此看起来更短.Mako的`<%/>`vs` <%%>`并不令人困惑(块与内联代码).Mako也有过滤功能,看起来也一样. (11认同)
  • @Jesse:我不*不喜欢Jinja2坚持(几乎)复制Python.您不能使用任何[内置函数](http://docs.python.org/library/functions.html),包括`len`和`enumerate`,除非您将它们作为上下文变量传递.使用`.__ len__`或`loop.index0`代替丑陋且不直观. (11认同)
  • 几个月前我写了这篇文章,我已经阅读了Mako过滤语法.我从来没有称它为愚蠢,但我确实质疑Mako团队做出的许多设计决定.在我看来,Jinja旨在尽快学习,需要最少的文档旅行.Mako不是,它表现出任意和不一致的语法.因为我*使用过它,我*可以判断Mako.足以让我觉得这不适合我.PS,一个引号用于引用实际上说的单词.你暗示我说一个更好或一个是愚蠢的,但我没有说. (9认同)
  • @JesseDhillon:实际上,你确实说过"你提供的例子进一步证明了Mako患有句法愚蠢".无论如何,由于PyCharm在版本2.0中添加了对Mako和Jinja2的支持,或许我们应该从他们的开发人员那里得到关于语法复杂性的判断:D (2认同)
  • 做了一些编辑以使比较匹配 Jinja2。我的猜测是 mako 更棒。我的意思是,如果您有 jinja2 模板并想转换为 mako,您可以制作一个预编译器,它可以理解 jinja2 语法并使其在 mako 中工作。顺便说一句,mako 语法比 jinja2 更 Pythonic。 (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

它针对性能进行了优化(在此处此处更多),经过充分测试记录.