Python匹配字典ID:Flask中关联服务器与多磁盘信息并展示
解决服务器与多磁盘信息关联展示的问题
我完全懂你的需求——要让每个服务器条目下展示它对应的所有磁盘信息,而不是只匹配到第一个磁盘。咱们分两步来搞定:先调整后端代码把服务器和磁盘数据关联起来,再修改前端模板渲染这些关联后的内容。
第一步:修改Flask后端代码,关联服务器与磁盘数据
原来的代码是把服务器和磁盘分开存成两个独立列表,现在我们需要把每个服务器对应的所有磁盘信息合并到服务器的字典里。具体做法是:
- 先把磁盘列表按
Server ID分组,方便快速查找某台服务器的所有磁盘; - 遍历服务器列表,给每个服务器字典添加一个
drives字段,对应它的全部磁盘信息。
修改后的后端代码如下:
# 处理服务器信息,逻辑和原来一致 testlist = [] for row in test: testlist.append({ 'Server ID': row[0], 'ServerName': row[1], 'Primary Role': row[2], 'Secondary Role': row[3], 'CPU-Name': row[4], 'Operating System': row[5] }) # 处理磁盘信息,同时按Server ID分组 drivelists = [] drive_map = {} for row in drives: drive = { 'Server ID': row[0], 'Drive Mapping': row[1], 'FreeSpace': row[2], 'TotalSpace': row[3], 'Percentage Used': row[4] } drivelists.append(drive) # 按Server ID分组磁盘,方便后续关联 server_id = drive['Server ID'] if server_id not in drive_map: drive_map[server_id] = [] drive_map[server_id].append(drive) # 给每个服务器绑定对应的磁盘列表 for server in testlist: server_id = server['Server ID'] # 如果没有对应磁盘,返回空列表避免模板报错 server['drives'] = drive_map.get(server_id, []) return render_template('servers.html', basicserverinfo=testlist)
第二步:修改HTML模板,渲染服务器的所有磁盘信息
现在每个服务器字典里都有了drives字段,我们可以在模板里遍历这个字段,把所有磁盘信息展示出来。另外注意原来的<h>标签是不合法的HTML标签,换成<h3>更规范;还有进度条要对应每个磁盘的使用率,而不是服务器的:
修改后的模板代码:
{% for info in basicserverinfo %} <div class="container"> <div class="panel panel-default"> <h3>{{ info['ServerName'] }}</h3> <table class="table table-bordered"> <div class="dl-horizontal"> <dt>Server Name</dt> <dd> {{ info['ServerName'] }}</dd> <dt>Primary Role</dt> <dd> {{ info['Primary Role'] }}</dd> <dt>Secondary Role</dt> <dd> {{ info['Secondary Role'] }}</dd> <dt>CPU</dt> <dd> {{ info['CPU-Name'] }}</dd> <dt>Operating System</dt> <dd> {{ info['Operating System'] }}</dd> </div> </table> <!-- 新增磁盘信息展示区域 --> {% if info['drives'] %} <h4>Disk Details</h4> <table class="table table-bordered"> <thead> <tr> <th>Drive Letter</th> <th>Free Space</th> <th>Total Space</th> <th>Usage %</th> <th>Usage Status</th> </tr> </thead> <tbody> {% for drive in info['drives'] %} <tr> <td>{{ drive['Drive Mapping'] }}</td> <td>{{ drive['FreeSpace'] }}</td> <td>{{ drive['TotalSpace'] }}</td> <td>{{ drive['Percentage Used'] }}%</td> <td> <div class="progress"> <div class="progress-bar" role="progressbar" style="width: {{ drive['Percentage Used'] }}%;" aria-valuenow="{{ drive['Percentage Used'] }}" aria-valuemin="0" aria-valuemax="100"> {{ drive['Percentage Used'] }}% </div> </div> </td> </tr> {% endfor %} </tbody> </table> {% else %} <p class="text-muted">No disk information available for this server.</p> {% endif %} </div> </div> {% endfor %}
这样修改后,每个服务器面板下都会完整展示它的所有磁盘信息,包括每个磁盘的使用进度条,完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者Mahoney
相关产品推荐
相关产品推荐

