Невозможно добавить новые данные списка к дикте в цикле for
У меня есть список IP, возвращаемый из POST в listip. Я хочу перебрать список IP и сохранить данные в словаре, чтобы потом вывести их на веб-страницу. Но словарь переопределяет значения только для последнего IP. Как я могу решить эту проблему? В настоящее время в списке есть 3 IP, но dict хранит только данные последнего переданного IP.
def healthcheckresults(request):
if not listip:
return render(request, "home/homepage.html",)
for ip in range(len(listip)):
conn = manager.connect(
host= listip[ip],
port='22',
username='XXX',
password = 'XXX',
timeout=10
)
result = conn.get_ospf_neighbor_information()
hostnameresult = conn.get_software_information()
hostname = hostnameresult.xpath('//software-information/host-name/text()')
ospfneighboraddress = result.xpath('//ospf-neighbor/neighbor-address/text()')
ospfneighborinterface = result.xpath('//ospf-neighbor/interface-name/text()')
ospfneighborstate= result.xpath('//ospf-neighbor/ospf-neighbor-state/text()')
ospfneighborID = result.xpath('//ospf-neighbor/neighbor-id/text()')
##METHOD1
ospfdictkey = {"hostname":[],"ospfneighboraddress":[],"ospfneighborinterface":[],"ospfneighborstate":[],"ospfneighborID":[]}
ospfmetalist = [hostname,ospfneighboraddress,ospfneighborinterface,ospfneighborstate,ospfneighborID]
for key, value in zip(ospfdictkey, ospfmetalist):
ospfdictkey[key].append(value)
##METHOD2
ospfdict={"hostname":hostname,"ospfneighboraddress":ospfneighboraddress,"ospfneighborinterface":ospfneighborinterface, "ospfneighborstate":ospfneighborstate,"ospfneighborID":ospfneighborID }
context = {'LUnique': zip(ospfneighboraddress, ospfneighborinterface, ospfneighborstate,ospfneighborID)}
conn.close_session()
listip.clear()
return render(request, "healthcheck/healthcheckresults.html",{
"ospfneighboraddress":ospfneighboraddress,
"ospfneighborinterface":ospfneighborinterface,
"ospfneighborstate":ospfneighborstate,
"ospfneighborID":ospfneighborID,
"context":context,
"hostname":hostname,
"listip":listip,
"ospfdict":ospfdict,
"ospfdictkey":ospfdictkey,
})
Оба указанных метода возвращают одни и те же данные, когда я проверяю данные в словаре.
{'hostname': ['R3-ISP'], 'ospfneighboraddress': ['192.168.5.34', '192.168.5.5', '192.168.5.10'], 'ospfneighborinterface': ['ae10.0', 'ae2.0', 'ae3.0'], 'ospfneighborstate': ['Full', 'Full', 'Full'], 'ospfneighborID': ['172.0.0.6', '172.0.0.2', '172.0.0.4']}
{'hostname': [['R3-ISP']], 'ospfneighboraddress': [['192.168.5.34', '192.168.5.5', '192.168.5.10']], 'ospfneighborinterface': [['ae10.0', 'ae2.0', 'ae3.0']], 'ospfneighborstate': [['Full', 'Full', 'Full']], 'ospfneighborID': [['172.0.0.6', '172.0.0.2', '172.0.0.4']]} ['R3-ISP']
В каждом методе вы перезаписываете dict. Помните, что код повторяется в каждой итерации
for ip in range(len(listip)):
Это означает, что когда вы устанавливаете ключи и значения в первой строке каждого метода, вы перезаписываете все дикты с таким именем, которые использовались ранее.
Одним из способов избежать этого может быть создание пустого списка и добавление в него каждой новой дикты при создании. Затем вы можете циклически просматривать список, чтобы увидеть каждый dict.
aList = []
for ip in range(len(listip)):
...
#Method1
...
aList.append(ospfdictkey )
#Method2
...
aList.append(ospfdict)