代码之家  ›  专栏  ›  技术社区  ›  Brian M. Hunt

includes之后的Jinja2编译扩展

  •  3
  • Brian M. Hunt  · 技术社区  · 15 年前

    在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 把X数进去 y.html ,我希望和期望的行为是什么?

    换句话说,是否有方法延迟解析或压扁从 _get_x() 在里面 x.html ?

    非常感谢你的阅读。

    谨致问候,

    布瑞恩

    1 回复  |  直到 9 年前
        1
  •  3
  •   Armin Ronacher    15 年前

    Jinja2执行模板数据流。该模板是一个求值指令,用于将指令转换为一个较小的字符串流,该字符串通过 render() 方法。但是,您也可以通过调用 generate() 而不是 渲染() .

    有了一些带内信令和流的后处理,人们可能能够实现类似的功能,但这与Jinja2的设计方式背道而驰,因此它可能会严重崩溃,完全不受支持。