Jinja2 синтаксис почти такой же, как у Django, с очень небольшими отличиями, и вы получаете гораздо более мощный механизм шаблонов, который также компилирует ваш шаблон в байт-код (FAST!) .
Я использую его для шаблонов, в том числе в самом Django, и это очень хорошо. Вы также можете легко написать расширения, если какая-то нужная вам функция отсутствует.
Вот несколько примеров генерации кода:
>>> 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'