我将Jinja2与webapp2一起使用。
Jinja2将所有'上下文'数据编码为unicode,正如他们的文档所说。当我尝试将json字符串插入模板时,这证明是有问题的:
jsonData = json.loads(get_the_file('catsJson.txt'))
我将jsonData传递给模板并且我能够成功循环它但是当我将一个json元素插入HTML时,它看起来像这样:
<option value='[u'dogs', u'cats']'>
我希望它看起来像这样(因为它在原始的json字符串中):
<option value='["dogs", "cats"]'>
有什么建议吗?
答案 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标记。顺便提一下,可能会将True
和False
修复为true
和false
,因为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>