web-dev-qa-db-fra.com

Mako ou Jinja2?

Je n'ai pas trouvé une bonne comparaison de jinja2 et Mako. Que feriez-vous pour quelles tâches?

Personnellement, j'ai été satisfait par mako (dans le contexte d'une application web pylônes) mais je suis curieux de savoir si jinja2 a des fonctionnalités/améliorations sympas que mako n'a pas? -ou peut-être les inconvénients? -

49
ychaouche

Personnellement, je préfère la syntaxe de Jinja2 à celle de Mako. Prenez cet exemple sur le site Web de 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>

Il y a tellement de constructions ici que je devrais consulter la documentation avant même de pouvoir commencer. Quelles balises commencent comme <% et fermez avec />? Lesquels sont autorisés à fermer avec %>? Pourquoi existe-t-il encore une autre façon d'entrer dans la langue du modèle lorsque je veux sortir une variable (${foo})? Qu'est-ce que c'est avec ce faux XML où certaines directives se ferment comme des balises et ont des attributs?

Voici l'exemple équivalent dans 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 a des filtres, ce que Mako m'a dit, mais je ne les ai pas vus. Les fonctions de filtrage n'agissent pas comme des fonctions normales, elles prennent un premier paramètre implicite de la valeur filtrée. Ainsi, à Mako, vous pourriez écrire:

${escape(default(get_name(user), "No Name"))}

C'est horrible. Dans Jinja2, vous écririez:

{{ user | get_name | default('No Name') | escape }}

À mon avis, les exemples Jinja2 sont extrêmement plus lisibles. Jinja2 est plus régulier, dans la mesure où les balises commencent et se terminent de manière prévisible, soit avec {% %} pour les directives de traitement et de contrôle, ou {{ }} pour la sortie des variables.

Mais ce sont toutes des préférences personnelles. Je ne connais pas de raison de plus pour choisir Jinja2 plutôt que Mako ou vice-versa. Et les pylônes sont assez grands pour que vous puissiez les utiliser!

La mise à jour incluait les macros Jinja2. Bien que conçu de toute façon, l'exemple de Jinja2 est plus facile à lire et à comprendre. La philosophie directrice de Mako est "Python est un excellent langage de script. Ne réinventez pas la roue ... vos modèles peuvent le gérer!" Mais les macros de Jinja2 (l'ensemble du langage, en fait) ressemblent plus à Python que Mako fait!

40
Jesse Dhillon

Jetez un oeil à wheezy.template exemple:

@require(user, items)
Welcome, @user.name!
@if items:
    @for i in items:
        @i.name: @i.price!s.
    @end
@else:
    No items found.
@end

Il est optimisé pour les performances (plus ici et ici ), enfin testé et documenté .

7
Python Best Friend