jinja2 模板可以访问(和修改)全局 python 脚本变量吗?

Can jinja2 templates access (and modify) global python script variables?

我想使用 python 和 jinja2 创建特定的文本文件结构。 (不是 HTML)。这些文件是静态的,由多个段组成,每个段由不同的 jinja 模板创建。

这些以随机顺序出现的每个片段都必须按顺序编号。

原则上:

Segment A  (no 1)
---
My Segment B (no 2)
---
Another Segment C (no 3)

我使用 python 中的变量跟踪当前号码。

我当然可以把这个变量传递给每个模板,像这样。

outfile=[]   # array for output
# get some objects...
for i in range(1,5):   # example to test
    t=myTemplate.render(nr=i, mystring=f"This is template nr {i}")
    outfile.append(t)

为了清楚和简单起见,我想避免将 global/s(可能还有更多)转移到每个模板渲染调用。

我需要查找的是 Jinja2 全局名称空间吗?

您可以修改 Jinja2 环境来定义全局变量,这些变量稍后可以被该环境中的任何模板访问,如下所示: (使用 Flask 应用程序制作的示例 - 其他运行时可能意味着访问环境的不同方式)

app.jinja_env.globals['varName'] = 'variableValue'

这让您可以像访问变量一样访问变量 render_template

return render_template("template.html", varName = 'variableValue')

这是一个答案,因为评论不允许格式化。

以下结束作业。

我的模板:

; ------- text object ---------
TESTER: {{tester}}  # as explained by  matszwecja #

我的脚本:

import jinja2
templateLoader = jinja2.FileSystemLoader(searchpath="./templates")

templateEnv = jinja2.Environment(loader=templateLoader, newline_sequence='\r\n')

templateEnv.globals['tester'] = '12345'   # test for global stuff

Tobj_text=templateEnv.get_template('obj_text')

t=Tobj_text.render()

print (t)