渲染JSON而不替换Jinja中的字符

时间:2015-07-30 16:11:36

标签: python json flask jinja2

我有一些Python数据将被发送到JavaScript图表。我将其转储到JSON并将其传递给模板。当我渲染数据时,它包含html实体(")而不是引号,这是无效的。如何正确地将JSON数据从Python传递到JavaScript?

pieData = [{'color': '#400068', 'name': 'xyz', 'value': 10}, {'color': '#4a8624', 'name': 'abc', 'value': 30}]
render_template('index.html', piedata=json.dumps(pieData))
var pieData2 = {{ piedata }};
// renders as
var pieData2 = [{"color": "#5461ae", "name": "fizi.yadav", "value": 10}, {"color": "#e1dce4", "name": "surya.pradhan", "value": 30}, {"color": "#7835f0", "name": "fred.hsu", "value": 276}]

1 个答案:

答案 0 :(得分:10)

Jinja autoescapes可能不安全的字符(如引号),以避免安全问题。您需要告诉它您正在呈现的数据是安全的,可以使用模板中的db/views/your_stuff.view.sql过滤器,也可以将其包装在视图中的|safe中。您也可以使用Markup过滤器,而不是手动解析和标记JSON。

使用|tojson从视图中将其标记为安全。

Markup

或在模板中标记为安全。

from markupsafe import Markup
render_template('index.html', piedata=Markup(json.dumps(pieData)))

最好只在模板中转换它而不在视图中调用{{ piedata|safe }} 。较早版本的Flask需要调用json.dumps,但不再需要|tojson|safe

|safe