остановить колбу, дублирующую загруженную переменную - PullRequest
0 голосов
/ 12 ноября 2018

Я создаю базовый сайт управления облачной инфраструктурой, и у меня возникла проблема со страницей со списком виртуальных машин.

Приложение колбы извлекает список, созданный через 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-файле, чтобы заставить его загружаться только один раз за сеанс или что-то подобное, но мои навыки интерфейса не достигают этого уровня.

Кто-нибудь знает, что я могу сделать в этой ситуации или где я иду не так?Любой совет с благодарностью.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вам нужно инициализировать 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
0 голосов
/ 12 ноября 2018

Вы близки - переменная, которую вы на самом деле должны сбрасывать каждый раз, не 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()вместо этого вы увидите удвоение, которое вы испытываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...