停止烧瓶复制加载的变量

时间:2018-11-12 14:25:55

标签: python html variables flask libcloud

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

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应用程序脚本和/或myVms函数中每次调用myVms = {}变量(即zip_list)来“消除”此变量来解决,但是似乎不起作用;问题仍然存在。

我还查看了flask-caching,以查看每次重新加载时清除烧瓶的高速缓存是否可以解决该问题,但似乎无法解决。

我认为我可以更改html文件中的内容,以强制每次会话仅加载一次或类似的内容,但是我的前端技能没有达到这么高的水平。

有人知道我在这种情况下或在哪里出问题时可以做什么吗?任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您很亲密-每次实际需要重置的变量不是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)

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

答案 1 :(得分:1)

您需要使用空的def create_box(width=1, height=1, length=1, material='cardboard', color='brown'): box = Box() set_size(box, width=width, height=height, length=length) set_appearance(box, material=material, color=color) 初始化const https = require('https'); const http = require('http'); const fs = require('fs'); const app = require('./app'); const options = { key: fs.readFileSync('./server.key'), cert: fs.readFileSync('./server.crt') }; const https_port = 443; const server_https = https.createServer(options, app); server_https.listen(https_port,"0.0.0.0"); const http_port = 80; const server_http = http.createServer( function (req, res) { res.writeHead(301, { "Location": "https://" + req.headers['host'] + req.url }); res.end(); }); server_http.listen(http_port,"0.0.0.0"); 。并且如果存在键,则将其追加到其列表中,否则将vm_list设置为空列表。这是由dict完成的。

尝试一下:

dict[key]