50

jinja2 と Mako の良い比較が見つかりませんでした。どのタスクに何を使用しますか?

個人的には (pylons Web アプリのコンテキストで) mako に満足していましたが、jinja2 に mako にはない優れた機能/改善があるかどうか知りたいですか? -または多分欠点?-

4

2 に答える 2

44

個人的には、Mako よりも Jinja2 の構文の方が好きです。この例は、Mako の Web サイトから取ってください。

<%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}変数 ( )を出力したいときにテンプレート言語を入力する別の方法があるのはなぜですか? 一部のディレクティブがタグのように閉じて属性を持つ、この偽の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 はより規則的であり、{% %}処理および制御ディレクティブ、または{{ }}変数の出力のいずれかで使用されます。

しかし、これらはすべて個人的な好みです。Mako よりも Jinja2 を選択する、またはその逆を選択するもう 1 つの実質的な理由を私は知りません。そして、Pylons はどちらでも使用できるほど優れています!

アップデートには、Jinja2 マクロが含まれていました。いずれにせよ不自然ではありますが、私の意見では、Jinja2 の例の方が読みやすく、理解しやすいと思います。Mako の指針となる哲学は、「Python は優れたスクリプト言語です。車輪を再発明する必要はありません...テンプレートで処理できます!」というものです。しかし、Jinja2 のマクロ (実際には言語全体) は、Mako よりも Python に似ています!

于 2010-08-08T21:14:15.907 に答える