Рассылка с компиляцией Jinja2 после включения
Вопрос
В jinja2, возможно ли иметь Node
от AST Render ведь include
Заявления завершены?
Это ключ кусок раствора для большей головоломки.
Пример кода:
хитрый
from jinja2 import nodes, Environment, FileSystemLoader
from jinja2.ext import Extension
class XExtension(Extension):
tags = set(['x', 'get_x'])
def __init__(self, environment):
super(XExtension, self).__init__(environment)
environment.extend(
x = 0,
)
def parse(self, parser):
tag = parser.stream.next()
return getattr(self, "_%s" % str(tag))(parser, tag)
def _get_x(self, parser, tag):
""" Return the output """
return nodes.Const(self.environment.x)
def _x(self, parser, tag):
""" Add an x """
self.environment.x += 1
return nodes.Const('<!-- Adding an X -->')
env = Environment(
loader = FileSystemLoader('.'),
extensions = [XExtension],
)
template = env.get_template('x.html')
print template.render()
x.html.
Xx {% x %} Xx {% x %}
{% include "y.html" %}
Xs xes: {% get_x %}
y.html.
Yx {% x %}
Ys xes: {% get_x %}
Вывод
Xx <!-- Adding an X --> Xx <!-- Adding an X -->
Yx <!-- Adding an X -->
Ys xes:3
Xs xes 2
Как можно было бы возможно иметь Xs xes
подсчитать х в y.html
, что это поведение, которое я желаю и ожидаю?
Другими словами, есть ли способ отложить разбор или уравновешивание текста, возвращаемого из _get_x()
в x.html
?
Большое спасибо за чтение.
С уважением,
Брайан
Решение
Jinja2 делает потоковое изменение данных шаблона. Шаблон оценивается инструкция по эксплуатации в поток меньших струн, которые приносятся в реальную строку Unicode render()
метод. Однако вы также можете получить поток, позвонив в generate()
вместо render()
.
С некоторыми внутриполосными сигнализациями и постпроцессией потока можно, вероятно, смогут реализовать что-то подобное, но оно против способа того, как Jinja2 был спроектирован так, чтобы оно могло сломаться и совершенно не поддерживаться.