JavaScript 使用 Jinja 模板中呈现的数据引发 SyntaxError

标签 javascript python flask

我正在尝试将数据作为 JSON 从 Flask 路由传递到渲染 JavaScript 的 Jinja 模板。我想使用 JavaScript 迭代数据。浏览器显示 SyntaxError: Unexpected token '&'。需要一个属性名称。 当对渲染的数据调用 JSON.parse 时。如何在 JavaScript 中使用渲染的 JSON 数据?

var obj = JSON.parse({{ data }})
for (i in obj){
   document.write(obj[i].text + "<br />");
}
def get_nodes(node):
    d = {}
    if node == "Root":
        d["text"] = node
    else:
        d["text"] = node.name

    getchildren = get_children(node)
    if getchildren:
        d["nodes"] = [get_nodes(child) for child in getchildren]
    return d

tree = get_nodes("Root")
return render_template("folder.html", data=tree)

如果我只是将 {{ data }} 放入 HTML 部分,我看到的内容看起来是正确的。

{'text': 'Root', 'nodes': [{'text': u'Prosjekt3'}, {'text': u'Prosjekt4', 'nodes': [{'text': u'mappe8'}]}]}

最佳答案

Flask 的 Jinja 环境会自动转义 HTML 模板中呈现的数据。这是为了避免开发人员尝试呈现不受信任的用户输入时出现安全问题。

由于您传递的 Python 对象被视为 JSON,因此 Flask 提供了 tojson 过滤器,它会自动将数据转储为 JSON 并将其标记为安全。

return render_template('tree.html', tree=tree)
var tree = {{ tree|tojson }};

当您只查看 HTML 中呈现的数据时,它看起来是正确的,因为浏览器将转义符号显示为真实符号(尽管在本例中您看到的是 Python 字典的字符串表示形式,而不是 JSON,所以有仍然存在一些问题,例如 u 标记)。

以前版本的 Flask 没有将转储的数据标记为安全,因此您可能会遇到类似 {{ tree|tojson|safe }} 的示例,但不再需要这些示例。

<小时/>

如果您不渲染 JSON(或者您已经将 JSON 转储为字符串),则可以使用 safe 过滤器告诉 Jinja 数据可以安全渲染,无需转义。

# already dumped to json, so tojson would double-encode it
return render_template('tree.html', tree=json.dumps(tree))
var tree = {{ tree|safe }};

您还可以在渲染之前将字符串包装在 Markup 中,它相当于 safe 过滤器。

# already dumped and marked safe
return render_template('tree.html', tree=Markup(json.dumps(tree)))
var tree = {{ tree }};
<小时/>

如果您不将此数据传递给 JavaScript,而是在 Jinja 中使用它,则不需要 JSON。传递实际的 Python 数据,不要对其调用 tojson,并像使用模板中的任何其他数据一样使用它。

return render_template('tree.html', tree=tree)
{% for item in tree %}
    <li>{{ item }}</li>
{% endfor %}

关于JavaScript 使用 Jinja 模板中呈现的数据引发 SyntaxError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37437958/

相关文章:

javascript - 如何使用多个系列将图例添加到剑道股票图表?

javascript - __webpack_hmr 转到错误的端口并失败

python - 我如何为我的 Flask 应用程序使用 WSGI?我的应用程序使用线程

python - 某些 WTForm 验证方法上消息不闪烁

python - 简单的数据表 flask

javascript - 使用 jQuery.extend 并将自定义对象作为属性时出现意外行为

javascript - onClick 在 C# 中的按钮单击上不触发

python - Matplotlib:索引颜色图

python - 使用 PyGObject 右键单击​​上下文菜单

python - 运行 python 脚本解析 IOS 配置文件时出现错误消息