Невозможно добавить новые данные списка к дикте в цикле 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)
Вернуться на верх