Mako或Jinja2?

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

我personnaly满意mako(在一个挂架web应用程序上下文),但很好奇,知道jinja2有一些不错的function/改进,mako不? – 或者也许是缺点?

我个人比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> 

这里有这么多的构造,我甚至不能在开始之前查阅文档。 哪些标签以<%开头,并以/> ? 哪些被允许closures%> ? 为什么当我想输出一个variables( ${foo} )时,还有另外一种方法来input模板语言? 什么是这个虚假的 XML,其中一些指令像标签一样closures并具有属性?

这是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有filter,我告诉Mako也有,但我没有看到他们。 filter函数不像常规函数那样工作,它们将被过滤的值的隐式第一个参数。 因此在Mako你可能会写:

 ${escape(default(get_name(user), "No Name"))} 

那太糟了。 在Jinja2中,你会写:

 {{ user | get_name | default('No Name') | escape }} 

在我看来,Jinja2的例子是非常可读的。 Jinja2更为经常,因为标签以可预测的方式开始和结束,无论是用于处理和控制指令的{% %} ,还是用于输出variables的{{ }}

但这些都是个人喜好。 我不知道有更多的理由selectJinja2而不是Mako,反之亦然。 而塔塔也够大,你可以使用!

更新包括Jinja2macros。 虽然在任何情况下都有所作为,但我认为Jinja2的例子更容易阅读和理解。 Mako的指导哲学是“Python是一种伟大的脚本语言,不要重新发明轮子……你的模板可以处理它! 但是Jinja2的macros(实际上是整个语言)看起来更像是Mako做的Python!

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

它针对性能进行了优化(更多这里和这里 ), 经过充分testinglogging