停止烧瓶复制加载的变量



我正在构建一个基本的云基础设施管理站点,但列出虚拟机的页面有问题。

flask应用程序提取一个列表,该列表是通过各种云平台的API生成的,格式如下:

vm_list = {
'vmid': [],
'name': [],
'state': [],
'platform': []
}

通过循环API输出并附加每个值来填充该列表,如下所示:

def zip_list():
...
for node in driver.list_nodes():
vm_list["vmid"].append(node.uuid)
vm_list["name"].append(node.name)
vm_list["state"].append(node.state)
vm_list["platform"].append(driver.name)
...
myVms = zip(vm_list['name'], vm_list['vmid'], vm_list['platform'], vm_list['state'])
return myVms

我通过我的烧瓶应用程序加载这个,如下所示:

@app.route('/vms/')
def vms():
myVms = {}
myVms = vm.zip_list()
return render_template('VMs.html', vm_list=myVms)

VMs.html页面将这些数据加载到一个表中:

<table class="tableClass">
<tr>
<th>Name</th>
<th>id</th>
<th>Plaform</th>
<th>State</th>
</tr>
{% for row in vm_list %}
<tr>
<td>{{ row[0] }}</td>
<td>{{ row[1] }}</td>
<td>{{ row[2] }}</td>
<td>{{ row[3] }}</td>
<tr>
{% endfor %}
</table>

这样可以很好地加载数据。然而,我的问题是,每次刷新页面时,数据都会被加载并再次附加到列表中,使表的大小增加了一倍。每次刷新都会将整个vm_list列表再次添加到表中。

我曾认为,每次在flask应用程序脚本和/或zip_list函数中调用myVms变量(即myVms = {}(时,都可以通过"置零"来解决这个问题,但这似乎不起作用;这个问题仍然存在。

我还研究了烧瓶缓存,看看每次重新加载时清除烧瓶的缓存是否会修复它,但似乎不会

我想我可以更改html文件中的某些内容,强制每个会话只加载一次或类似的内容,但我的前端技能并没有达到这一点。

有人知道在这种情况下我能做什么吗?或者我哪里出了问题?如有任何建议,不胜感激。

您很接近-每次实际需要重置的变量不是myVms,而是vm_list,如下所示:

class Node:
counter = 0
def __init__(self):
c_str = str(Node.counter)
self.uuid = "asdf" + c_str
self.name = "test " + c_str
self.state = "wow " + c_str + " such state"
Node.counter += 1

class Driver:
def __init__(self, number_of_nodes):
self.nodes = []
for x in range(number_of_nodes):
self.nodes.append(Node())
self.name = "the greatest driver"
def list_nodes(self) -> list:
return self.nodes

driver = Driver(10)

def zip_list():
vm_list = {'vmid': [], 'name': [], 'state': [], 'platform': []}
for node in driver.list_nodes():
vm_list["vmid"].append(node.uuid)
vm_list["name"].append(node.name)
vm_list["state"].append(node.state)
vm_list["platform"].append(driver.name)
myVms = zip(vm_list['name'], vm_list['vmid'], vm_list['platform'], vm_list['state'])
return myVms

print("First time:")
my_list = zip_list()
for i in my_list:
print(i)
print("Second time:")
my_list = zip_list()
for i in my_list:
print(i)

如果你在zip_list()函数之外初始化vm_list,你会看到你正在经历的加倍。

您需要用一个空的dict初始化vm_list。如果某个键存在,则将其追加到其列表中,否则将dict[key]设置为空列表。这是由setdefault完成的。

试试这个:

def zip_list():
...
vm_list = {}
for node in driver.list_nodes():
vm_list.setdefault('vmid', []).append(node.uuid)
vm_list.setdefault('name', []).append(node.name)
vm_list.setdefault('state', []).append(node.state)
vm_list.setdefault('platform', []).append(node.platform)
...
myVms = zip(vm_list['name'], vm_list['vmid'], vm_list['platform'], vm_list['state'])
return myVms

最新更新