1

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

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列表再次添加到表中。

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

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

我在想我可以更改 html 文件中的某些内容以强制每个会话仅加载一次或类似的内容,但我的前端技能并没有那么远。

有谁知道在这种情况下我能做什么或者我哪里出错了?任何意见是极大的赞赏。

4

2 回答 2

1

你很接近了——你每次实际需要重置的变量不是myVmsbut 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)

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

于 2018-11-12T14:50:05.200 回答
1

您需要vm_list使用空的dict. 如果存在键,则附加到其列表中,否则将其设置为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
于 2018-11-12T14:53:16.700 回答