当前位置: 首页 > 面试题库 >

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

公冶桐
2023-03-14
问题内容

我试图将数据作为JSON从Flask路由传递到呈现JavaScript的Jinja模板。我想使用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'}]}]}

问题答案:

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

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

return render_template('tree.html', tree=tree)



var tree = {{ tree|tojson }};

当您仅查看HTML呈现的数据时,它看起来是正确的,因为浏览器将转义的符号显示为真实符号(尽管在这种情况下,您看到的是Python
dict的字符串表示形式,而不是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 %}


 类似资料:
  • 问题内容: 我有一条这样定义的路线: 现在,在模板中,我想使用以下方式调用该路由url_for(): 我试过了: 那抛出一个 谁能建议如何将出现在模板中的转换为,以便在单击时调用正确的名称? 问题答案: 里面的所有内容都是类似Python的表达式。你无需在其中使用另一个引用变量。 放下多余的括号: (请注意,该函数使用终结点名称,而不是URL路径;在你的示例中,该名称默认为该函数的名称)。

  • 问题内容: 我有一条这样定义的路线: 现在,在模板中,我想使用以下方式调用该路由: 我试过了: 谁能建议如何将出现在模板中的转换为,以便在单击时调用正确的名称? 问题答案: 里面的所有内容都是类似Python的表达式。你无需在其中使用另一个引用变量。 放下多余的括号: (请注意,该函数使用终结点名称,而不是URL路径;在你的示例中,该名称默认为该函数的名称)。

  • 当我的模板包含一些JavaScript时,我遇到了一个问题。例如: 果然,模板解释器希望将双卷曲大括号{{}}中的所有内容解释为变量。现在我想知道是否有办法关闭类似于的此类行为。

  • 问题内容: 一个布局模板和三个子模板。 layout.html tags.html content.html comment.html 代码 我很困惑如何渲染每个子模板并将结果组合到布局输出中。 谢谢。 问题答案: 与往常一样,该文档是一个很好的起点。 我在操场上写了一个工作实例 解释一下: 您不需要struct文字中的字符串:,而不是 您只能将单个对象传递给模板才能执行,这将按照指令中的要求将对

  • 对编码来说是新的,如果已经涵盖了,请道歉。花了几个晚上在Django的文档、YouTube、谷歌和这里尝试各种方法来解决这个问题。 我有一个与驾驶员相关的模型路线,我试图在我的模板上显示所有与该路线相关的驾驶员的路线。然而,目前我所能得到的只是来自路线模型的数据,而不是相关驾驶员的数据。 会感谢任何帮助,因为我正在努力让我的头! Models.py Views.py 样板 我尝试过.prefetc

  • 我在Android Studio中创建一个项目时遇到了一个问题。(版本1.5.1) 我一步一步地描述我的行动: null 会有什么问题?