我尝试使用Jinja2构建json文档,并且该文档具有嵌套脚本。该脚本包含{{<variables>}}
,我需要将其替换为非json字符。因此,之后需要使用json.dumps()
对脚本进行json转义。
str = '{
"nestedScript" : {% include "scripts/sc.ps1" | json %}
}'
escape
功能不够,因为最终产品包含有效HTML但不是JSON的字符。
我正在思考以下几点:
str = '{
"nestedScript" : {{ include("scripts/sc.ps1") | json}} %}
}'
使用一些自定义过滤器或其他东西,但我似乎无法编写include函数,以便它也在脚本中进行变量替换。到目前为止,这是我的脚本,我将其作为全局包含:
文件夹结构:
.
└── 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}}"
}
答案 0 :(得分:0)
以一种感觉有点hackish的方式解决这个问题,所以我喜欢一些反馈。在实例化我的类时,我定义了一个名为LoadContent()
的全局函数:
include_script
loader = jinja2.FileSystemLoader(templates_folder)
env = inja2.Environment(loader=self.loader)
env.globals['include_script'] = render_script_func(env)
返回一个函数,该函数从环境中检索上下文并使用它来呈现我引用的文件:
render_script_func
现在,在渲染之前,所有人都要做的是,将渲染的上下文添加到全局def render_script_func(env):
def render_script(name):
ctx = env.globals['context']
tmpl = env.get_template(name)
raw = tmpl.render(ctx)
return json.dumps(raw)
return render_script
对象中:
context
当模板使用template = env.get_template(template_name)
template.environment.globals["context"] = ctx
renderedData = template.render(ctx)
时,脚本将被渲染,然后进行json编码。
仍感觉有点不对劲,但也是如此。
答案 1 :(得分:0)
鉴于(不完整)示例,您似乎正在搜索filter
标记。
首先,表单中的脚本实际上可以运行,并根据json
定义json.dumps()
过滤器:
import json
import jinja2
loader = jinja2.FileSystemLoader('templates')
env = jinja2.Environment(loader=loader)
env.filters['json'] = json.dumps
template = env.get_template('test.json')
print(
template.render({
'service_name': 'worker',
'context_name': 'googlesellerratings',
})
)
缺少的PowerShell脚本,如果在JSON("
)中使用,则会导致出现问题:
echo "{{service_name}}"
现在是test.json
模板的解决方案:
{
"nestedScript" : {% filter json %}{% include "scripts/script.ps1" %}{% endfilter %}
}
最后打印结果:
{
"nestedScript" : "echo \"worker\""
}