【问题标题】:Jinja2 template rendering getting empty stringJinja2模板渲染得到空字符串
【发布时间】:2018-08-19 04:08:48
【问题描述】:

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

【问题讨论】:

  • 签出this answer
  • u 前缀是一个类型指示符,你有Unicode 字符串。这是解码 JSON 数据时的正常现象。 他们不是问题
  • 你能给我们产生的输出吗?你得到Messages not available 吗? print(python_message) 行是否在运行 Flask 的控制台上产生输出?
  • 鉴于 messages 是一个字典,for message in messages 循环只会从字典中生成单个 'messages' 键。您的意思是改用python_message['messages'] 吗?
  • @MartijnPieters:我在浏览器屏幕上得到了空字符串。 HTML页面的sn-p是
    • .... 是的,print(python_message) 显示服务器响应,如上所述。

标签: python python-2.7 flask jinja2


【解决方案1】:

你有 Unicode 字符串,u 前缀是一个类型指示符。它们与您的问题无关,在解码 JSON 时完全正常。

您的问题是您正在循环 外部字典的键,而不是 python_message[u'messages'] 列表中包含的消息。

获取该列表;使用dict.get(),如果缺少键,您可以生成一个默认值,这里的列表会很有帮助:

return render_template('messages.html', messages = python_message.get(u'messages', []))

您需要谨慎使用编写模板的编辑器,因为您使用了 字符,而您应该使用" 字符。在您的输出中,很明显您的浏览器已经在这些属性周围加上了正确的引号,所以现在您有一个 id 为 ”messages” 的 div,而不是 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>

【讨论】:

  • 这是完美的解决方案!谢谢!
  • 我是 Python 和 Flask 的新手。我不知道任何可用的最佳 IDE。你能给我推荐几个吗?
  • 这太宽泛了,我是 Old Skool 并且使用与大多数人不同的编辑器。我不是要问的人。 (我根据上下文使用 Vim、Sublime 和 Nuclide(Atom on steriods)。
猜你喜欢
  • 2018-07-29
  • 2017-03-01
  • 2015-01-06
  • 1970-01-01
  • 2012-02-17
  • 2015-05-05
  • 2015-11-08
  • 1970-01-01
  • 2017-10-04
相关资源
最近更新 更多