如何使用自定义 Jinja2 模板函数,该函数依赖于调用“render”的函数中的变量

问题描述 投票:0回答:1

我试图弄清楚如何将变量传递到自定义模板函数中,到目前为止我还无法弄清楚如何使其工作。 我的想法是,我将传入一个模板,并希望它调用自定义 Jinja2 函数。 我需要将变量传递给自定义函数。 这将在 Celery 作业中运行,但为了这个问题,我简化了问题。

类似于:

import jinja2

def calling_function():
   var1 = "joe"
   environment = jinja2.Environment()
   func_dict = {
   "do_it": do_it
   }
   environment.globals.update(func_dict)
   output = environment.from_string("{{ do_it() }}").render()
   print(output)

def do_it():
    return "yes: %s" % (var1)


calling_function()

我收到一个名称错误,这是有道理的,因为它超出了范围: NameError:名称“var1”未定义。您指的是: 'vars' 吗?

如果我将 var1 放在范围之外:

import jinja2

var1 = ""

def calling_function():
   var1 = "joe"
   environment = jinja2.Environment()
   func_dict = {
   "do_it": do_it
   }
   environment.globals.update(func_dict)
   output = environment.from_string("{{ do_it() }}").render()
   print(output)

def do_it():
    return "yes: %s" % (var1)

输出: 是的:

脚本完成,但 var1 仍然为空。 我希望能够将变量降至 do_it,而无需进行操作或拥有除 {{ do_it() }} 以外的任何内容。 不知道是否需要将变量传入模板然后再拉出来?

python jinja2 celery
1个回答
0
投票

您可以将变量传递给

.render
,使它们可以在渲染代码中访问:

import jinja2

def do_it(var1):
    return "yes: %s" % (var1)

def calling_function():
   environment = jinja2.Environment()
   output = environment.from_string("{{ do_it(var1) }}").render(do_it = do_it, var1 = "joe")
   print(output)

calling_function()
yes: joe
© www.soinside.com 2019 - 2024. All rights reserved.