我收到了REST服务的回复。此响应是一组JSON对象。使用这个数组,我试图使用Jinja2模板框架在HTML页面上显示每个JSON对象的各个属性。但是它在浏览器上显示空字符串。
我从服务中获得的JSON响应是
{
u'messages':
[
{u'text': u'hello', u'author_id': 1, u'pub_date': 1518506778, u'message_id': 1},
{u'text': u'hell', u'author_id': 2, u'pub_date': 1518420378, u'message_id': 2},
]
}
不确定每个字符串前的u字符是什么。其余服务是在Flask开发的。
下面是python代码:
r = requests.get('http://127.0.0.1:3000/api/v1.0/messages')
@app.route('/messages')
def public_timeline():
"""Displays the latest messages of all users."""
python_message = json.loads(r.text)
print("******")
print(python_message)
return render_template('messages.html', messages = python_message)
模板代码是:
{% if messages %}
<ul id=”messages”>
{% for message in messages %}
<li>
<div class=”text”>
<a>{{message['text']}}</a>
</div>
</li>
{% endfor %}
</ul>
{% else %}
<p>Messages not available :(</p>
{% endif %}
我认为问题是由于每个字符串前面有不必要的u字符。如何在浏览器屏幕上解决空白输出问题?
浏览器中的输出是:
<html><head></head><body><ul id="”messages”">
<li>
<div class="”text”">
<a></a>
</div>
</li> ....
答案 0 :(得分:1)
您有 Unicode 字符串,u
前缀是类型指示符。它们与您的问题无关,在解码JSON时完全正常。
您的问题是您正在遍历外部字典的键,而不是python_message[u'messages']
列表中包含的消息。
获取该列表;如果缺少密钥,使用dict.get()
可以产生默认值,这里的列表会有所帮助:
return render_template('messages.html', messages = python_message.get(u'messages', []))
您需要注意使用哪种编辑器来编写模板,因为您使用”
个字符作为使用"
字符的位置。在您的输出中,很明显您的浏览器在这些属性周围添加了正确的引号,因此现在您的div为”messages”
,而不是messages
。
演示,带有更正的引号:
>>> from jinja2 import Template
>>> python_message = {
... u'messages':
... [
... {u'text': u'hello', u'author_id': 1, u'pub_date': 1518506778, u'message_id': 1},
... {u'text': u'hell', u'author_id': 2, u'pub_date': 1518420378, u'message_id': 2},
... ]
... }
>>> template = Template('''
... {% if messages %}
... <ul id="messages">
... {% for message in messages %}
... <li>
... <div class="text">
... <a>{{message['text']}}</a>
... </div>
... </li>
... {% endfor %}
... {% else %}
... <p>Messages not available :(</p>
... {% endif %}
... ''')
>>> print(template.render(messages=python_message['messages']))
<ul id="messages">
<li>
<div class="text">
<a>hello</a>
</div>
</li>
<li>
<div class="text">
<a>hell</a>
</div>
</li>
>>> print(template.render(messages=[]))
<p>Messages not available :(</p>