在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的设计方式背道而驰,因此它可能会严重损坏并且完全不受支持.