web-dev-qa-db-ja.com

マコかジンジャ2?

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

私は(パイロンWebアプリのコンテキストで)makoに個人的に満足しましたが、jinja2にmakoにはない素敵な機能/改善があるかどうか知りたいですか? -または、マイナス面か?-

47
ychaouche

個人的には、Makoよりも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のより規則的なタグは、予測可能な方法で開始および終了します。処理および制御ディレクティブの場合は{% %}、変数の出力の場合は{{ }}のいずれかです。

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

Updateに含まれるJinja2マクロ。いずれにせよ考案されましたが、私の意見では、Jinja2の例は読みやすく、理解しやすいです。 Makoの指針となる哲学は、「Pythonは優れたスクリプト言語です。車輪を再発明しないでください。テンプレートで処理できます!」しかし、Jinja2のマクロ(実際には言語全体)は、Makoが行うPython!

40
Jesse Dhillon

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

performance(more here and here )、welltestedおよびdocumented

7