ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

包含之后的Jinja2编译扩展

2019-12-09 00:56:24  阅读:232  来源: 互联网

标签:templates jinja2 python


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

标签:templates,jinja2,python
来源: https://codeday.me/bug/20191208/2095302.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有