Jinja2编译扩展后包含

时间:2010-11-28 01:20:56

标签: python templates jinja2

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

这是一个关键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,这是我想要和预期的行为?

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

非常感谢您阅读。

亲切的问候,

布赖恩

1 个答案:

答案 0 :(得分:3)

Jinja2传输模板数据。模板被评估指令,指令用于通过render()方法连接成实际unicode字符串的较小字符串流。不过,您也可以通过调用generate()而不是render()来获取信息流。

通过一些带内信令和流的后处理,人们可能能够实现类似的东西,但它与Jinja2的设计方式相反,因此它可能会破坏并且完全不受支持。