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

Jinja 2 does not iterate over my python dict (read from Redis)

API /api/v1/version returns 特定 pod 中应用程序的所有版本。 return 类型是一个 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'}
    }"
    }

上述字典存储在变量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 %}

如果以上内容有任何不清楚之处或需要任何进一步信息,请告诉我。

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