2010-08-08 15 views
44

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

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

Répondre

38

Personnellement, je préfère la syntaxe de Jinja2 à celle de Mako. Prenez cet exemple de la Mako website

<%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 tant de constructions ici que je devrai consulter la documentation avant que je puisse même commencer. Quels tags commencent comme <% et se terminent par />? Lequel de ceux qui sont autorisés à fermer avec %>? Pourquoi existe-t-il un autre moyen d'entrer la langue du modèle lorsque je veux générer une variable (${foo})? Qu'est-ce qui est avec ce faux XML où certaines directives se ferment comme des balises et ont des attributs?

Ceci est l'exemple équivalent 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, que je me suis laissé dire Mako a également, mais je ne les ai pas vus. Les fonctions de filtrage n'agissent pas comme des fonctions régulières, elles prennent un premier paramètre implicite de la valeur filtrée. Ainsi, dans Mako, vous pourriez écrire:

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

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

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

À mon avis, les exemples Jinja2 sont beaucoup plus lisibles. Jinja2 est plus régulier, en ce 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 la sortie des variables.

Mais ce sont toutes des préférences personnelles. Je ne connais pas une raison plus importante pour choisir Jinja2 sur Mako ou vice-versa. Et Pylons est assez bien que vous pouvez utiliser non plus!

Mise à jour Macros Jinja2 incluses. Bien que conçu dans tous les cas, à mon avis l'exemple 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 templates peuvent y faire face!" Mais les macros de Jinja2 (la langue entière, en fait) ressemblent plus à Python que Mako!

+6

Pas vraiment juste: Votre "équivalent en Jinja" a exclu la moitié du contenu de l'exemple de Mako et semble donc plus court. Le '<% />' de Mako vs '<% %>' n'est pas si confus (blocs vs code inline). Mako a aussi des fonctions de filtre et elles ont la même apparence. –

+0

J'ai dit que ce sont des questions de préférence personnelle, vous êtes libre de montrer comment la syntaxe de Mako a plus de sens pour vous. Je n'ai pas inclus la définition de Makerow parce que cela ne fait pas partie d'un modèle de Jinja. –

+0

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

5

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 here et here), bien testé et documenté.

+0

Ça a l'air sympa, mais la version disponible sur pip est assez obsolète: https://pypi.python.org/pypi/wheezy.template – nowox