Mako 还是 Jinja2? [关闭]

Posted

技术标签:

【中文标题】Mako 还是 Jinja2? [关闭]【英文标题】:Mako or Jinja2? [closed] 【发布时间】:2011-03-27 01:04:25 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

我个人更喜欢 Jinja2 的语法而不是 Mako 的语法。以Mako website中的这个例子为例

<%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>

这里有太多的构造,我什至必须先查阅文档才能开始。哪些标签以&lt;% 开头并以/&gt; 结尾?其中哪些可以使用%&gt; 关闭?为什么我想输出一个变量($foo)时,还有另一种输入模板语言的方法?这个 faux 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!

【讨论】:

不太公平:您的“Jinja 等效项”排除了 Mako 示例中的一半内容,因此看起来更短。 Mako 的 &lt;% /&gt;&lt;% %&gt; 并没有那么令人困惑(块与内联代码)。 Mako 也有过滤功能,它们看起来都一样。 @Jesse:我喜欢 Jinja2 坚持(几乎)复制 Python。您不能使用任何built-in functions,包括lenenumerate,除非您将它们作为上下文变量传递。而使用.__len__loop.index0 是丑陋且不直观的。 你怎么能比较 jinja 过滤器和 mako 过滤器,说它们“更好”,但“你没见过”mako 过滤器?似乎不太合理。我们对过滤器使用与 Jinja 几乎相同的语法:$user | get_name, default('No Name') , escape。很明显,您从未使用过 Mako,这非常好,但您几乎无法进行合理的比较,或者称我们的语法“愚蠢”,谢谢! 我在几个月前写了这篇文章,后来我开始阅读 Mako 过滤语法。我从未称其为愚蠢,但我确实质疑 Mako 团队做出的许多设计决策。在我看来,Jinja 的设计目的是尽可能快地学习,并且需要最少的文档访问。 Mako 不是,它表现出任意且不一致的语法。我可以评判Mako,因为我已经使用过它;足以让我决定它不适合我。 PS,引号是用来引用实际说的话。你的意思是我说一个更好或一个愚蠢,但我都没有说。 @JesseDhillon:实际上,您确实说过“您提供的示例进一步证明了 Mako 患有句法愚蠢”。无论如何,由于 PyCharm 在 2.0 版本中添加了对 Mako 和 Jinja2 的支持,也许我们应该从他们的开发人员那里得到关于语法复杂性的判断:D【参考方案2】:

看看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)进行了优化,测试记录

【讨论】:

看起来不错,但是 pip 上的版本已经过时了:pypi.python.org/pypi/wheezy.template smx 是最小的代码库,易于理解和扩展:pypi.org/project/smx/0.8.4%define(make_row, &lt;tr&gt; %for(name in row, &lt;td&gt;%name%&lt;/td&gt; ) &lt;/tr&gt; ) %set(body, &lt;table&gt; %for(row in rows, %makerow% ) &lt;/table&gt; ) %expand(%include(base.html))

以上是关于Mako 还是 Jinja2? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Django 与 Mako Jinja2 模板比较的集成使用:render_to_response。问题?

Mako

Flask模板

Jinja2学习

第四章 Jinja2模版

如何使用Mako SDK检测PDF中的透明度?