在 Jinja2 中,是否可以在所有 include
语句完成后从 AST 渲染中获得一个 Node
?
这是一个关键piece of a solution to a bigger puzzle .
示例代码:
x.py
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
中的 X,这是我想要和期望的行为?
换句话说,有没有办法延迟解析或展平从 x.html
中的 _get_x()
返回的文本?
非常感谢您的阅读。
亲切的问候,
布莱恩
最佳答案
Jinja2 做模板数据流。该模板被评估成一个较小的字符串流的指令,这些字符串通过 render()
方法连接成一个实际的 unicode 字符串。但是,您也可以通过调用 generate()
而不是 render()
来获取流。
通过一些带内信号和流的后处理,人们可能能够实现类似的东西,但它违反了 Jinja2 的设计方式,因此它可能会严重崩溃并且完全不受支持。
关于python - 包含后的 Jinja2 编译扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4294837/