Mako还是Jinja2?

2024-04-25 12:17:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我没有找到一个很好的比较金贾2和Mako。你会用什么做什么工作?

我个人对mako(在pylons web app上下文中)很满意,但很想知道jinja2是否有一些mako没有的好特性/改进?-或者是负面影响?-


Tags: webappjinja2mako特性pylons负面影响
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

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

我个人更喜欢Jinja2的语法,而不是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})时,为什么还有其他方法输入模板语言?这个fauxXML有什么用,其中一些指令像标记一样关闭并有属性?

这是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的规则性更强,因为标记以可预测的方式开始和结束,要么使用{% %}来处理和控制指令,要么使用{{ }}来输出变量。

但这些都是个人喜好。我不知道还有什么更重要的理由来选择金贾2而不是马科,反之亦然。而且塔架足够大,你可以使用任何一个!

更新包含Jinja2宏。尽管在任何情况下都是人为的,但在我看来,Jinja2示例更容易阅读和理解。Mako的指导思想是“Python是一种很棒的脚本语言。不要重新发明轮子…你的模板可以处理它!”但是Jinja2的宏(实际上是整个语言)看起来更像Mako所做的Python!

相关问题 更多 >