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!
小智 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)
它针对性能进行了优化(在此处和此处更多),经过充分测试和记录.