2010-08-08 12 views
44

Non ho trovato un buon confronto tra jinja2 e Mako. Cosa useresti per quali compiti?Mako o Jinja2?

Personalmente sono stato soddisfatto da mako (in un contesto di app web piloni) ma sono curioso di sapere se jinja2 ha alcune caratteristiche/miglioramenti che Mako non ha? -o forse aspetti negativi? -

risposta

38

Personalmente preferisco la sintassi di Jinja2 su Mako. Prendete questo esempio dal 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> 

Ci sono così tanti costrutti qui che avrei dovuto consultare la documentazione prima che potessi iniziare. Quali tag iniziano come <% e chiudono con />? Quali di questi sono autorizzati a chiudere con %>? Perché c'è ancora un altro modo per inserire la lingua del modello quando voglio produrre una variabile (${foo})? Cosa c'è di questo faux XML dove alcune direttive si chiudono come tag e hanno attributi?

Questo è l'esempio equivalente in 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 ci sono i filtri, che mi hanno detto Mako ha anche, ma io non li ho visti. Le funzioni di filtro non agiscono come funzioni regolari, prendono un primo parametro implicito del valore che viene filtrato. Quindi in Mako potresti scrivere:

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

È orribile. In Jinja2 si può scrivere:

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

A mio parere, gli esempi Jinja2 sono estremamente più leggibili. Jinja2 è più regolare, in quanto i tag iniziano e finiscono in modo prevedibile, con {% %} per le direttive di elaborazione e controllo o {{ }} per l'output delle variabili.

Ma queste sono tutte le preferenze personali. Non conosco un motivo più sostanziale per scegliere Jinja2 su Mako o viceversa. E i piloni sono abbastanza grandi da poterli usare!

Aggiornamento incluso macro Jinja2. Anche se in ogni caso ideato, a mio parere l'esempio di Jinja2 è più facile da leggere e capire. La filosofia guida di Mako è "Python è un grande linguaggio di scripting: non reinventare la ruota ... i tuoi modelli possono gestirlo!" Ma i macro di Jinja2 (l'intero linguaggio, in realtà) somigliano più a Python che a Mako!

+6

Non proprio equo: il tuo "equivalente in Jinja" ha escluso metà della roba dall'esempio Mako e quindi sembra più breve. '' di Mako '' non è tale confusione (blocchi vs codice inline). Mako ha anche funzioni di filtro e sembrano uguali. –

+0

Ho detto che sono questioni di preferenza personale, sei libero di mostrare come la sintassi di Mako ha più senso per te. Non ho incluso la definizione di "Mush" perché non fa parte di un modello in Jinja. –

+0

@Jesse - per essere onesti, perché non definire e utilizzare una macro chiamata 'makerow' per l'esempio di Jinja2? ** Vedi: ** http://jinja.pocoo.org/2/documentation/templates#macros –

5

Date un'occhiata a wheezy.template esempio:

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

E 'ottimizzato per le prestazioni (più here e here), ben testati e documentato.

+0

Sembra bello, ma la versione disponibile su pip è abbastanza obsoleta: https://pypi.python.org/pypi/wheezy.template – nowox