Tuve buenos votos cuando answering this same question's duplicate.
Mi respuesta fue:
Jinja2.
Niza syntax, buena customization possibilities.
Se integra bien. Se puede incluir en la zona de pruebas, por lo que no tiene que confiar completamente en los autores de sus plantillas. (Mako no puede).
También es bastante rápido, con la ventaja de compilar su plantilla para el código de bytes y la memoria caché, como en la demostración a continuación:
>>> import jinja2
>>> print jinja2.Environment().compile('{% for row in data %}{{ row.name | upper }}{% endfor %}', raw=True)
from __future__ import division
from jinja2.runtime import LoopContext, Context, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join
name = None
def root(context, environment=environment):
l_data = context.resolve('data')
t_1 = environment.filters['upper']
if 0: yield None
for l_row in l_data:
if 0: yield None
yield unicode(t_1(environment.getattr(l_row, 'name')))
blocks = {}
debug_info = '1=9'
Este código se ha generado sobre la marcha Jinja2. Por supuesto, el compilador lo optimiza aún más (p.eliminando if 0: yield None
)
http://docs.djangoproject.com/en/dev/ref/templates/api/#configuring-the-template-system-in-standalone-mode –