variable last jinja for comment python templates template-engine mako jinja2

python - last - jinja2 declare variable



Mako o Jinja2? (2)

No encontré una buena comparación de jinja2 y Mako. ¿Qué usarías para qué tareas?

Personalmente, me quedé satisfecho con el mako (en el contexto de una aplicación web de pilones), pero tengo curiosidad por saber si jinja2 tiene algunas características / mejoras que el mako no tiene. -o tal vez desventajas? -


Eche un vistazo al ejemplo de 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

Está optimizado para el rendimiento (más here y here ), bien probado y documentado .


Yo personalmente prefiero la sintaxis de Jinja2 sobre la de Mako. Toma este ejemplo del sitio 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>

Hay tantos constructos aquí que tendría que consultar la documentación antes de que pudiera comenzar. ¿Qué etiquetas comienzan como <% y cierran con /> ? ¿Cuáles de esos están autorizados a cerrar con %> ? ¿Por qué hay otra forma de ingresar el lenguaje de plantilla cuando quiero generar una variable ( ${foo} )? ¿Qué pasa con este falso XML donde algunas directivas se cierran como etiquetas y tienen atributos?

Este es el ejemplo equivalente en 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 tiene filtros, que me han dicho que Mako también tiene pero no los he visto. Las funciones de filtro no actúan como funciones regulares, sino que toman un primer parámetro implícito del valor que se filtra. Por lo tanto, en Mako puedes escribir:

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

Esto es horrible. En Jinja2 escribirías:

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

En mi opinión, los ejemplos de Jinja2 son extremadamente más legibles. Jinja2 es más regular, ya que las etiquetas comienzan y terminan de forma predecible, ya sea con {% %} para las directivas de procesamiento y control o {{ }} para generar variables.

Pero estas son todas las preferencias personales. No conozco una razón más importante para elegir Jinja2 sobre Mako o viceversa. ¡Y Pylons es lo suficientemente bueno como para que puedas usar cualquiera de los dos!

La actualización incluyó macros Jinja2. Aunque ideado en cualquier caso, en mi opinión, el ejemplo de Jinja2 es más fácil de leer y comprender. La filosofía de Mako es "Python es un excelente lenguaje de scripting. No reinventes la rueda ... ¡tus plantillas pueden manejarlo!" Pero las macros de Jinja2 (¡todo el lenguaje, en realidad) se parecen más a Python que a Mako!