我试图弄清楚如何将变量传递到自定义模板函数中,到目前为止我还无法弄清楚如何使其工作。 我的想法是,我将传入一个模板,并希望它调用自定义 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() }} 以外的任何内容。 不知道是否需要将变量传入模板然后再拉出来?
您可以将变量传递给
.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