Jinja2:自定义筛选器布尔标志

2024-05-12 20:32:51 发布

您现在位置:Python中文网/ 问答频道 /正文

在这里,我尝试回到这个例子:

Embed custom filter definition into jinja2 template?

但我不想使用大写字符串,而是希望使用布尔标志

在我的jinja2模板中,我希望如下所示:

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

如果修正标志设置为false,我希望它打印“set”。渲染时,预期输出为:

set /etc/network/interfaces

如果“修正”标志设置为true,则在渲染时不会打印“设置”:

/etc/network/interfaces

使用链接中的示例,是否有一种方法可以将布尔标志传递到函数中,以便当我使用env.filters['remediate'] = remediate定义它时,它将确定在渲染时是否输出“set”

渲染配置.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

Tags: envjinja2标志defetctemplatenetworkloader
1条回答
网友
1楼 · 发布于 2024-05-12 20:32:51

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

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

在我的Jinja2模板文件中,我有这样的东西

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

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

在render()函数中,您将有如下内容:

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

这是为了让Jinja2知道传递到remediate的值“set”等于字符串“set”

相关问题 更多 >