jinja2 と Mako の良い比較が見つかりませんでした。どのタスクに何を使用しますか?
個人的には (pylons Web アプリのコンテキストで) mako に満足していましたが、jinja2 に mako にはない優れた機能/改善があるかどうか知りたいですか? -または多分欠点?-
jinja2 と Mako の良い比較が見つかりませんでした。どのタスクに何を使用しますか?
個人的には (pylons Web アプリのコンテキストで) mako に満足していましたが、jinja2 に mako にはない優れた機能/改善があるかどうか知りたいですか? -または多分欠点?-
個人的には、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 に似ています!