python - 包含后的 Jinja2 编译扩展

标签 python templates jinja2

在 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/

相关文章:

python - Alembic:包括约束以拒绝带有字符的字符串

用于类声明的 C++ 模板

python - flask jinja2.exceptions.TemplateSyntaxError

flask - 如何传递给 url_for 默认参数?

python - flask:跨 View 函数传递参数

python - 通过恰好 k 次买卖股票获得最大利润

c++ - SFINAE 重载,必须考虑哪些规则

python - 如何从 sqlalchemy 获取元数据以在 jinja 中显示为表格?

python - 从装饰器中获取 Python 函数的所属类

javascript - 带有模板和缓存的客户端 JS 框架?