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-enpre itreturn render_template('tree.html', tree=json.dumps(tree))var tree = {{ tree|safe }};你还可以Markup在渲染字符串之前将其包装起来,这等效于
safe过滤器。
# already dumped and marked safereturn 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 %}


