簡體   English   中英

停止燒瓶復制加載的變量

[英]stop flask duplicating a loaded variable

我正在構建一個基本的雲基礎架構管理站點,並且列出虛擬機的頁面有問題。

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 = {} )將myVmsmyVms來解決此問題,但這似乎不起作用。 問題仍然存在。

我還查看了燒瓶緩存,以查看每次重新加載時清除燒瓶的緩存是否可以解決該問題,但似乎無法解決。

我在想,我可以更改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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM