JSON在Jinja2模板中显示为unicode实体

时间:2012-01-03 10:20:51

标签: python django json jinja2

我将Jinja2与webapp2一起使用。

Jinja2将所有'上下文'数据编码为unicode,正如他们的文档所说。当我尝试将json字符串插入模板时,这证明是有问题的:

jsonData = json.loads(get_the_file('catsJson.txt'))

我将jsonData传递给模板并且我能够成功循环它但是当我将一个json元素插入HTML时,它看起来像这样:

<option value='[u&#39;dogs&#39;, u&#39;cats&#39;]'>

我希望它看起来像这样(因为它在原始的json字符串中):

<option value='["dogs", "cats"]'>

有什么建议吗?

3 个答案:

答案 0 :(得分:21)

您必须通过safe过滤器过滤该值,以告知jinja2它不应将任何其他过滤器应用于输出。在jinja2语法中,这将是:

{{ jsonData | safe }}

请注意,由于您正在调用json.loads,实际上您不再拥有json数据,因此您有一个python列表对象。因此,当它被序列化时,它与调用unicode(['dogs', 'cats'])相同,后者将为您提供u前缀。您可能不想实际解析json数据,或者您需要手动将列表转换为字符串,而不是让jinja2为您执行此操作。

答案 1 :(得分:0)

在Jinja 2.9中,我遵循@ Xion的建议,首先使用map('string')将可迭代元素转换为字符串。然后我将地图过滤结果转换为一个列表,最后使用tojson内置过滤器输出为JSON。

{{ jsonData|map('string')|list|tojson }} 

答案 2 :(得分:0)

如果你不需要在Jinja方面对阵列采取行动,但只需要将数据包传递给javascript,我建议使用:

json.dumps(python_object_or_array)

https://docs.python.org/2/library/json.html

这个字符串化的变量,当传递给jinja时会传递给javascript,而不会在变量上获得pythonic unicode标记。顺便提一下,可能会将TrueFalse修复为truefalse,因为javascript可以预期。

所以在烧瓶的背景下,它看起来像这样:

@app.route('/')
def home():
     if userNeedsToLogin():
          session['routePath'] = request.full_path
          return render_template('login.html', error=None)
     else:
          return render_home()

def render_home():
     print "Rendering Home"
     results = get_some_database_query_results()
     data_out = json.dumps(results)
     return render_template('home.html', data=data_out)

home.html的

<!DOCTYPE HTML>
<html>
<head>
  <!-- import javascript function processData -->
</head>
<body>
  <!-- page of stuff -->
  <script>
     processData( {{ data|safe }} );
  </script>
</body>
</html>