Jinja2:自定义过滤器布尔标志

时间:2020-11-12 02:10:03

标签: python python-3.x jinja2

我正在尝试在此跟踪此示例:

Embed custom filter definition into jinja2 template?

但我不想做大写字母,而是想做一个布尔标志。

在我的jinja2模板中,我想要这样的东西:

{{ set | remediate }} /etc/network/interfaces

如果补救标志设置为false,我希望它打印“ set”。当我渲染时,预期的输出是:

set /etc/network/interfaces

如果补救标志设置为true,则在渲染时将不会打印“ set”:

/etc/network/interfaces

使用链接中的示例,是否可以将布尔值标志传递给函数,以便在我使用env.filters['remediate'] = remediate进行定义时,它将确定在渲染时是否输出“ set”?

render_config.py

from render import render

def main():
  flag = False
  render(flag)

render.py

def render(flag):

   import jinja2

   loader = jinja2.FileSystemLoader('/tmp')
   env = jinja2.Environment(autoescape=True, loader=loader)

   env.filters['remediate'] = remediate
   temp = env.get_template('test.jinja2')
   temp.render(set='set')

def remediate(flag):
   """Custom filter"""
   return flag

1 个答案:

答案 0 :(得分:1)

我设法编写了一个对我有用的解决方案。我在上面的链接中使用了与示例相同的概念,但对其进行了修改以评估布尔标志:

def remediate(input):
    """Custom filter"""
    if with_remediate == True:
        return input
    else:
        return ''

在Jinja2模板文件中,我有类似的内容。

{{ set | remediate }} /etc/network/interfaces

如果某个函数正在调用模板的呈现过程,则布尔标志可以设置为True或False-取决于您要实现的目标。在我的特定情况下,上面的模板引用了一些与网络设备相关的配置。显示配置时,不存在“设置”字符串。但是,要配置该行,必须包括“设置”。两种不同的功能,两种不同的用途,使用一种模板。

在您的render()函数中,您将具有以下内容:

config = baseline.render(set = 'set ')

这是为了让Jinja2知道传递给补救的值'set​​'等于字符串'set'。