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 对。
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 对。