Jinja2模板渲染得到空字符串

时间:2018-03-10 19:34:22

标签: python python-2.7 flask jinja2

我收到了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> ....  

1 个答案:

答案 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>