python - 访问 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)
我不确定合成器。这是我期望它做的:
- 查询 Source 设备并返回 JSON 格式的数据
- 查询目标设备并返回 JSON 格式的数据
- 比较两个查询
- 如果源设备中的对象也存在于目标设备中,则使用
PATCH
请求对其进行更新 - 如果源设备中的对象在目标设备中不存在,则使用
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}]
我正在尝试将从源返回的数据与从目标返回的数据进行比较。
这显然不起作用,因为我期望它起作用。我尝试了多种组合,但似乎找不到正确的方法。
任何帮助,将不胜感激。
解决方案
因为我不太确定你想做什么,所以这可能至少是其中的一部分:它将源与目标进行比较,并为你提供关于差异的报告。你可以从那里拿走它。包含的功能是从这里提升的。
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')...]
等希望它有所帮助。
推荐阅读
- node.js - 为子文件夹设置 NodeJS Express 路由器
- javascript - 使用 onclick 从日历返回日期值
- hsqldb - LOBase HSQL 避免将表名和字段名放在引号中
- php - spl_autoload_extensions 不加载类
- r - 如何显示具有相同变量的行?
- reactjs - Reactjs,通过 onChange 函数从级联加载数据
- asp.net-core - VS2022:如何让 ASP.NET Core 5 应用程序显示它的控制台窗口
- node.js - Google Drive API Nodejs在特定文件夹ID处搜索文件
- c - 更新文本文件 c 中的特定值
- delphi - 如何定义一个区域并检查鼠标是否在其中?