首页 > 解决方案 > 访问 JSON 格式的 python 请求的一部分

问题描述

我才刚刚开始用 Python 编写代码,我仍然试图弄清楚一切是如何工作的,所以如果它背后的逻辑不正确,请纠正我。

我正在编写一个脚本来查询一个设备并将返回的数据与另一台设备进行比较。目标是保持两个设备配置同步。

这是脚本:

import requests
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

net_objects = ['aaa','availability_group','dns_group','dns_host','group','host','multicast','network','range']

for obj in net_objects:
    src_URL = 'https://172.16.2.100:4444/api/objects/network/' + obj + '/'
    src_headers = {
        'Accept': 'application/json',
        'Authorization': 'Basic dG9rZW46U2tCaENIZUlRZnlVeEpBU3dqYUh2c0VHRmZjdWtDTFg='
        }
    src_net_obj = requests.get(src_URL, headers=src_headers, timeout=15, verify=False)

    dst_URL = 'https://172.16.2.101:4444/api/objects/network/' + obj + '/'
    dst_headers = {
        'Accept': 'application/json',
        'X-Restd-Err-Ack': 'all',
        'Authorization': 'Basic dG9rZW46dlZ3WnVZZGxpd01IRkxNVXpKVXZtZXhiZGZHSExobnI='
        }
    dst_net_obj = requests.get(dst_URL, headers=dst_headers, timeout=15, verify=False)

    for src_dict_item in src_net_obj.json():
        if src_dict_item["name"] in dst_net_obj.json():
            update =  requests.patch(url, headers=dst_headers, timeout=15, verify=False)
        else:
            update =  requests.put(url, headers=dst_headers, timeout=15, verify=False)

我不确定合成器。这是我期望它做的:

  1. 查询 Source 设备并返回 JSON 格式的数据
  2. 查询目标设备并返回 JSON 格式的数据
  3. 比较两个查询
  4. 如果源设备中的对象也存在于目标设备中,则使用PATCH请求对其进行更新
  5. 如果源设备中的对象在目标设备中不存在,则使用PUT请求创建它

我正在过滤name查询返回的值。如果源设备和目标设备中都存在该名称,我希望它使用源对象更新目标对象中的数据。我最终想比较对象中的实际数据,如果源和目标中的数据相同,则跳过当前对象,但稍后会出现。

Source 设备上的请求返回的数据GET如下所示:

[{'_locked': '', '_ref': 'REF_DefaultL2TPPool', '_type': 'network/network', 'address': '10.242.3.0', 'address6': 'fd32:5a88:8e98:3::', 'comment': 'Default L2TP VPN Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (L2TP)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': '', '_ref': 'REF_DefaultPPTPPool', '_type': 'network/network', 'address': '10.242.1.0', 'address6': 'fd32:5a88:8e98:1::', 'comment': 'Default PPTP Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (PPTP)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': '', '_ref': 'REF_NetNetNetVlan66Publi', '_type': 'network/network', 'address': '192.168.66.0', 'address6': '', 'comment': '', 'interface': '', 'name': 'VLAN 66 Public', 'netmask': 24, 'netmask6': 128, 'resolved': True, 'resolved6': False}, {'_locked': '', '_ref': 'REF_DefaultRWPool', '_type': 'network/network', 'address': '10.242.4.0', 'address6': 'fd32:5a88:8e98:4::', 'comment': 'Default IPsec VPN Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (IPsec)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': 'user', '_ref': 'REF_NetworkInternet', '_type': 'network/network', 'address': '0.0.0.0', 'address6': '', 'comment': '"Any" network, bound to interfaces with default IPv4 gateway', 'interface': 'REF_IntEthExternaWan', 'name': 'Internet IPv4', 'netmask': 0, 'netmask6': 0, 'resolved': True, 'resolved6': False}, {'_locked': '', '_ref': 'REF_DefaultSSLPool', '_type': 'network/network', 'address': '10.242.2.0', 'address6': 'fd32:5a88:8e98:2::', 'comment': 'Default SSL VPN IP Pool', 'interface': '', 'name': 'VPN Pool (SSL)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': 'user', '_ref': 'REF_NetworkInternet6', '_type': 'network/network', 'address': '0.0.0.0', 'address6': '::', 'comment': '"Any" network, bound to interfaces with default IPv6 gateway', 'interface': '', 'name': 'Internet IPv6', 'netmask': 0, 'netmask6': 0, 'resolved': False, 'resolved6': False}, {'_locked': '', '_ref': 'REF_DefaultCiscoRWPool', '_type': 'network/network', 'address': '10.242.5.0', 'address6': 'fd32:5a88:8e98:5::', 'comment': 'Default IPsec VPN Remote Access IP Pool for Cisco clients', 'interface': '', 'name': 'VPN Pool (Cisco)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': '', '_ref': 'REF_NetNetNetVlan1Site', '_type': 'network/network', 'address': '192.168.0.0', 'address6': '', 'comment': '', 'interface': '', 'name': 'NET - VLAN 1 Site 1', 'netmask': 24, 'netmask6': 128, 'resolved': True, 'resolved6': False}]

GET以下是目标设备上的请求返回的数据:

[{'_locked': '', '_ref': 'REF_DefaultL2TPPool', '_type': 'network/network', 'address': '10.242.3.0', 'address6': 'fd32:5a88:8e98:3::', 'comment': 'Default L2TP VPN Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (L2TP)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': '', '_ref': 'REF_DefaultPPTPPool', '_type': 'network/network', 'address': '10.242.1.0', 'address6': 'fd32:5a88:8e98:1::', 'comment': 'Default PPTP Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (PPTP)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': '', '_ref': 'REF_DefaultRWPool', '_type': 'network/network', 'address': '10.242.4.0', 'address6': 'fd32:5a88:8e98:4::', 'comment': 'Default IPsec VPN Remote Access IP Pool', 'interface': '', 'name': 'VPN Pool (IPsec)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': 'user', '_ref': 'REF_NetworkInternet', '_type': 'network/network', 'address': '0.0.0.0', 'address6': '', 'comment': '"Any" network, bound to interfaces with default IPv4 gateway', 'interface': 'REF_IntEthExternaWan', 'name': 'Internet IPv4', 'netmask': 0, 'netmask6': 0, 'resolved': True, 'resolved6': False}, {'_locked': '', '_ref': 'REF_DefaultSSLPool', '_type': 'network/network', 'address': '10.242.2.0', 'address6': 'fd32:5a88:8e98:2::', 'comment': 'Default SSL VPN IP Pool', 'interface': '', 'name': 'VPN Pool (SSL)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}, {'_locked': 'user', '_ref': 'REF_NetworkInternet6', '_type': 'network/network', 'address': '0.0.0.0', 'address6': '::', 'comment': '"Any" network, bound to interfaces with default IPv6 gateway', 'interface': '', 'name': 'Internet IPv6', 'netmask': 0, 'netmask6': 0, 'resolved': False, 'resolved6': False}, {'_locked': '', '_ref': 'REF_DefaultCiscoRWPool', '_type': 'network/network', 'address': '10.242.5.0', 'address6': 'fd32:5a88:8e98:5::', 'comment': 'Default IPsec VPN Remote Access IP Pool for Cisco clients', 'interface': '', 'name': 'VPN Pool (Cisco)', 'netmask': 24, 'netmask6': 64, 'resolved': True, 'resolved6': True}]

我正在尝试将从源返回的数据与从目标返回的数据进行比较。

这显然不起作用,因为我期望它起作用。我尝试了多种组合,但似乎找不到正确的方法。

任何帮助,将不胜感激。

标签: pythonpython-3.xpython-requests

解决方案


因为我不太确定你想做什么,所以这可能至少是其中的一部分:它将源与目标进行比较,并为你提供关于差异的报告。你可以从那里拿走它。包含的功能是从这里提升的

src = [the Source data you posted above]
dest = [the Destination data you posted above]

Import itertools

def compare_dict(dict1, dict2):
    for x1 in set(dict1.keys()).union(dict2.keys()):
        z = dict1.get(x1) == dict2.get(x1)
        if not z:
            print('key', x1)
            print('value A', dict1.get(x1), '\nvalue B', dict2.get(x1))
            print('-----\n')

for s,d in itertools.zip_longest(src,dest):
    if d is not None and s is not None:
        compare_dict(s,d)
    else:
        print('Not in Destination:',list(s.items()))

输出:

key netmask6
value A 128 
value B 64

.....
Not in Destination: [('_locked', ''), ('_ref', 'REF_DefaultCiscoRWPool')...]

等希望它有所帮助。


推荐阅读