Подтвердить что ты не робот

Мако или Jinja2?

Я не нашел хорошего сравнения jinja2 и Mako. Что бы вы использовали для каких задач?

Я лично был удовлетворен mako (в контексте веб-приложений pylons), но мне любопытно узнать, есть ли у jinja2 какие-то приятные функции/улучшения, которые нет у mako? или, может быть, минусы? -

4b9b3361

Ответ 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!

Ответ 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

Он оптимизирован для производительности (подробнее здесь и здесь), хорошо протестированы и задокументированы.