51 votes

Mako ou Jinja2 ?

Je n'ai pas trouvé de bonne comparaison entre jinja2 et Mako. Qu'utiliseriez-vous pour quelles tâches ?

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

46voto

Jesse Dhillon Points 4136

Je préfère personnellement la syntaxe de Jinja2 à celle de Mako. Prenons l'exemple suivant, tiré de la page 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 que je devrais consulter la documentation avant de pouvoir commencer. Quelles sont les balises qui commencent par <% et terminez par /> ? Quels sont ceux qui peuvent être clôturés par %> ? Pourquoi y a-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 que 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 dispose de filtres, dont on m'a dit que Mako disposait également, 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 à filtrer. Ainsi, dans 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 de Jinja2 sont beaucoup plus lisibles. Jinja2 est plus régulier, en ce sens que les balises commencent et se terminent d'une manière prévisible, soit avec {% %} pour les directives de traitement et de contrôle, ou {{ }} pour l'édition de variables.

Mais il s'agit là de préférences personnelles. Je ne connais pas de raison plus importante de choisir Jinja2 plutôt que Mako ou vice-versa. Et Pylons est suffisamment bon pour que vous puissiez utiliser l'un ou l'autre !

Mise à jour les macros Jinja2 incluses. Bien qu'il soit artificiel, l'exemple de Jinja2 est à mon avis plus facile à lire et à comprendre. La philosophie de Mako est la suivante : "Python est un excellent langage de script. Ne réinventez pas la roue... vos templates peuvent s'en charger !" Mais les macros de Jinja2 (tout le langage, en fait) ressemblent plus à Python que celles de Mako !

14 votes

Ce n'est pas vraiment juste : Votre "équivalent à Jinja" exclut la moitié des éléments de l'exemple de Mako et semble donc plus court. Celui de Mako <% /> vs <% %> n'est pas si déroutant (blocs vs code en ligne). Mako a également des fonctions de filtrage et elles se présentent de la même manière.

0 votes

J'ai dit qu'il s'agissait d'une question de préférence personnelle, vous êtes libre de montrer en quoi la syntaxe de Mako est plus logique pour vous. Je n'ai pas inclus la définition de makerow parce que cela ne fait pas partie d'un modèle dans Jinja.

0 votes

@Jesse -- pour être juste, pourquoi ne pas définir et utiliser une macro appelée makerow pour l'exemple Jinja2 ? Voir : jinja.pocoo.org/2/documentation/templates#macros

8voto

Jetez un coup d'œil à 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 performance (plus aquí y aquí ), et bien testé y documenté .

1 votes

Il est beau, mais la version disponible sur pip est assez obsolète : pypi.python.org/pypi/wheezy.template

0 votes

Smx est la plus petite base de code, facile à comprendre et à étendre : pypi.org/projet/smx/0.8.4 %define(make_row, <tr> %for(name in row, <td>%name%</td> ) </tr> ) %set(body, <table> %for(row in rows, %makerow% ) </table> ) %expand(%include(base.html))

4voto

William Points 91

J'ai écrit un article à ce sujet à l'adresse suivante http://williamferreira.net/blog/2010/12/28/mako-template-vs-jinja2/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X