Jinja 2不会迭代我的python dict(从Redis读取)

时间:2016-11-18 10:42:20

标签: python django dictionary redis jinja2

API / api / v1 / version返回特定pod中的所有应用程序版本。返回类型是OrderDict。我将它提供给我的jinja模板,以便在仪表板上显示相同内容。

随着服务器数量的增加,我需要在Redis中缓存我的对象。 奇怪的是,我的jinja2模板没有显示我从redis读取的字典。

我找到的唯一区别是即将到来的' u'在钥匙前面,我从redis那里得到的字典中没有。

示例:

Redis的词典

{'pod1':
"{'server1': {'status': 'failed', 'comment': 'Server is offline.'},
 'server2': {'status': 'failed', 'comment': 'Exception ConnectTimeout while extracting response'}",
'pod2':
"{'server-3':{'status':'success', 'build_number': '74', 'githash': '601a62162ad3cdd2e13f0728f1a9979281acefd4', 'timestamp': '2016-11-17 16:00:01', 'version': '1.0.74-RELEASE', 'tagname': 'release_2016_11_17'}
}"
}

Django生成的字典(在缓存之前)

{u'pod1':
    "{'server1': {'status': 'failed', 'comment': 'Server is offline.'},
     'server2': {'status': 'failed', 'comment': 'Exception ConnectTimeout while extracting response'}",
    u'pod2':
    "{'server-3':{'status':'success', 'build_number': '74', 'githash': '601a62162ad3cdd2e13f0728f1a9979281acefd4', 'timestamp': '2016-11-17 16:00:01', 'version': '1.0.74-RELEASE', 'tagname': 'release_2016_11_17'}
    }"
    }

上述dictonary存储在变量version_details中。下面的行渲染

return render_to_response("version.html", {'pods': version_details, 'teams': APP_DETAILS.keys()})

下面的代码片段是jinja2实现

<div class="uk-container uk-container-center uk-margin-top">

      <ul class="uk-grid" data-uk-grid-margin>
          {% for pod, details in pods.iteritems %}
              {% for server,server_details in details.iteritems %}
                  <li class="uk-width-1-3">
                    <div class="uk-panel uk-panel-box uk-width-large-1-1">
                        {% if server_details.status == 'success' %}
                            <div class="uk-panel-badge uk-badge uk-badge-success">{{ server_details.status }}</div>
                        {% else %}
                            <div class="uk-panel-badge uk-badge uk-badge-danger">{{ server_details.status }}</div>
                        {% endif %}
                        <h1 class="uk-panel-title uk-text-bold uk-text-nowrap"><i class="uk-icon-server"></i>{{ server }}</h1>
                        {% if server_details.status == "failed" %}
                            <p class="uk-text-break"><b>Comment:</b> {{ server_details.comment }}</p>
                        {% else %}
                            <p class="uk-text-break"><b>Jenkins Pipeline Number:</b> {{ server_details.build_number }}</p>
                            <p class="uk-text-break"><b>Githash:</b> {{ server_details.githash }}</p>
                            <p class="uk-text-break"><b>Timestamp:</b> {{ server_details.timestamp }}</p>
                            <p class="uk-text-break"><b>Version:</b> {{ server_details.version }}</p>
                            <p class="uk-text-break"><b>GitTag:</b> {{ server_details.tagname }}</p>
                        {%  endif %}
                    </div>
                  </li>
              {% endfor %}
          {% endfor %}

如果上述内容不清楚,或者如果需要任何进一步的信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

Jinja2无法迭代你的details,因为它实际上不是一个字典,它是一个字符串。您需要反序列化字符串,以便迭代各个键/值对。