Ответ 1
Я лично предпочитаю синтаксис 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}
)? Что с этим искусственным 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 вы можете написать:
${escape(default(get_name(user), "No Name"))}
Это ужасно. В Jinja2 вы напишете:
{{ user | get_name | default('No Name') | escape }}
По моему мнению, примеры Jinja2 чрезвычайно читабельны. Jinja2 более регулярный, в том, что теги начинаются и заканчиваются предсказуемым образом, либо с {% %}
для директив обработки и управления, либо {{ }}
для вывода переменных.
Но это все личные предпочтения. Я не знаю еще одной существенной причины, чтобы выбрать Jinja2 над Мако или наоборот. И Pylons достаточно велик, что вы можете использовать либо!
Обновить включены макросы Jinja2. Хотя, как мне кажется, пример Jinja2 легче читать и понимать. Мако-руководящая философия: "Python - отличный скриптовый язык. Не изобретайте велосипед... ваши шаблоны справятся с этим!" Но макросы Jinja2 (весь язык, на самом деле) больше похожи на Python, который делает Mako!