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

2024-11-28 08:37:00
admin
原创
10
摘要:问题描述:我正在尝试将数据作为 JSON 从 Flask 路由传递到 Jinja 模板渲染 JavaScript。我想使用 JavaScript 迭代数据。浏览器显示SyntaxError: Unexpected token '&'. Expected a property name.何时JSON.p...

问题描述:

我正在尝试将数据作为 JSON 从 Flask 路由传递到 Jinja 模板渲染 JavaScript。我想使用 JavaScript 迭代数据。浏览器显示SyntaxError: Unexpected token '&'. Expected a property name.何时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'}]}]}

解决方案 1:

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

由于您传递了一个要作为 JSON 处理的 Python 对象,因此 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 %}

解决方案 2:

我可以使用以下代码示例将其存档。

<script>
    console.log(JSON.parse({{json|safe}}))
</script>

解决方案 3:

问题是您的服务器返回的不是 JSON,而是呈现的 HTML,它使用 & 符号转义了一些符号。

而不是使用

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

尝试

return flask.jsonify(**tree)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   657  
  如何借鉴华为IPD体系优化企业研发?在当今竞争激烈的市场环境中,企业要想保持技术领先和产品竞争力,必须拥有一套高效且严谨的研发管理体系。华为作为全球领先的ICT解决方案提供商,其集成产品开发(IPD, Integrated Product Development)体系与质量管理体系(如ISO 9000系列)的融合实践,...
IPD项目管理   15  
  IPD流程图的7种经典绘制方法详解在产品开发领域,集成产品开发(Integrated Product Development,简称IPD)流程被广泛应用,以提高产品开发的效率和质量。IPD流程图作为这一流程的可视化工具,其绘制方法至关重要。本文将详细介绍七种经典的IPD流程图绘制方法,帮助项目管理人员和团队更好地理解和...
IPD研发管理体系   18  
  IPD流程:企业创新管理的核心引擎在当今快速变化的市场环境中,企业要想持续保持竞争力,就必须不断进行创新。而IPD(Integrated Product Development,集成产品开发)流程作为一种先进的产品开发管理模式,正逐渐成为众多企业提升创新能力、加速产品上市速度、降低开发成本的重要选择。本文将深入探讨IP...
IPD管理   18  
  IPD流程与传统产品开发流程的概述在产品开发领域,企业不断寻求高效、系统的管理方法以确保产品能够顺利从概念转化为市场成功的产品。集成产品开发(Integrated Product Development,简称IPD)流程与传统产品开发流程是两种截然不同的管理理念和方法。传统产品开发流程往往以职能部门为核心,各部门按顺序...
IPD流程中PDCP是什么意思   16  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用