【发布时间】:2016-09-08 13:06:01
【问题描述】:
我正在尝试使用 Jinja2 构建一个 json 文档,并且该文档有一个嵌套脚本。该脚本包含{{<variables>}},我需要将其与非json字符一起替换。因此,脚本之后需要使用json.dumps()进行json转义。
str = '{
"nestedScript" : {% include "scripts/sc.ps1" | json %}
}'
escape 函数是不够的,因为最终产品包含的字符是有效的 HTML,但不是 JSON。
我的想法是这样的:
str = '{
"nestedScript" : {{ include("scripts/sc.ps1") | json}} %}
}'
使用一些自定义过滤器或其他东西,但我似乎无法编写包含函数,以便它也可以在脚本中进行变量替换。到目前为止,这是我的脚本,我将其包含为全局:
完整示例
文件夹结构:
.
└── templates
├── test.json
└── scripts
└── script.ps1
模板文件:
test.json = '{
"nestedScript" : {{ include("scripts/script.ps1") | json}}
}'
脚本:
loader = jinja2.FileSystemLoader("templates")
env = jinja2.Environment(loader=self.loader)
template = env.get_template("test.json")
template.render({
'service_name': 'worker',
'context_name': 'googlesellerratings',
})
结果:
{
"nestedScript" : "echo {{service_name}}"
}
【问题讨论】:
-
你能举一个失败的例子吗?要使您的
include()函数正常工作,它必须返回 JSON。因此,如果模板是带有{{…}}占位符的文本文件,则该函数必须进行替换,然后对其进行反序列化,以便再次被| json过滤器序列化。似乎没有意义。 -
真正失败的不是json序列化,而是调用render时没有使用提供给模板的Context变量进行渲染。在当前示例中,任何
{{..}}块都不会被渲染,我不知道如何实现这一点并将其转换为安全的 json。 -
示例中缺少
scripts/script.ps1的内容以及对结果错误或您实际想要的结果的描述。此外程序不完整,缺少jinja2的导入,未定义的self,模板结果被丢弃而不是打印。 -
而且 Jinja2 2.8 版中没有
include()函数和json过滤器。这些是如何定义的?