3

在 Jinja2 中,是否可以在所有语句完成Node后从 AST 渲染?include

这是解决更大难题的关键部分

示例代码:

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计算 X 的数量y.html,这是我想要和期望的行为?

换句话说,有没有办法延迟解析或展平从_get_x()in返回的文本x.html

非常感谢您的阅读。

亲切的问候,

布赖恩

4

1 回答 1

3

Jinja2 进行模板数据的流式传输。模板被评估指令到一个较小的字符串流中,该流被该render()方法连接成一个实际的 unicode 字符串。但是,您也可以通过调用 intogenerate()而不是render().

通过一些带内信令和流的后处理,一个可能能够实现类似的东西,但这与 Jinja2 的设计方式背道而驰,因此它可能会严重破坏并且完全不受支持。

于 2010-11-28T01:43:11.833 回答