jinja2:包括脚本,替换{{variable}}和json编码结果

时间:2016-09-08 13:06:02

标签: python json jinja2

我尝试使用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}}"
}

2 个答案:

答案 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\""
}