Как извлечь данные с помощью API и Python? - PullRequest
1 голос
/ 29 октября 2019

У меня есть группа серверов, и я использую API для извлечения данных о хранилище. Чтобы получить подробную информацию о хранилище uuid (имя хранилища в json), я использую следующий код:

srvdet = requests.get('https://hhh.com/1.2/server/76856585', auth=HTTPBasicAuth('login', 'pass'))
srvdet_json = srvdet.json()
datas = srvdet.json()
print(datas)

И результат в json:

{
   "server": {
      "boot_order": "",
      "core_number": "2",
      "created": ,
      "firewall": "off",
      "host": ,
      "hostname": "hello",
      "ip_addresses": {
         "ip_address": [
            {
               "access": "private",
               "address": "",
               "family": ""
            },
            {
               "access": "",
               "address": "",
               "family": "",
               "part_of_plan": ""
            }
         ]
      },
      "license": 0,
      "memory_amount": "",
      "nic_model": "",
      "plan": "",
      "plan_ipv4_bytes": "",
      "plan_ipv6_bytes": "0",
      "state": "started",
      "storage_devices": {
         "storage_device": [
            {
               "address": "",
               "boot_disk": "0",
               "part_of_plan": "",
               "storage": "09845",
               "storage_size": ,
               "storage_title": "",
               "type": ""

}

На данный момент этоотлично работаетПроблема в том, когда мне нужно получить "09845" , что является значением для storage . Когда я пытаюсь использовать этот код:

for storage in datas['server']['storage_devices']['storage_device']:
    srvstorage = storage
    print(srvstorage)

Результат:

{'storage': '09845', 'storage_size':, 'address': '', 'boot_disk': '0', 'type': '', 'part_of_plan': 'yes', 'storage_title': ''}

Что я делаю не так? Как сохранить «09845» в переменной?

РЕДАКТИРОВАТЬ:

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

{
   "storage": {
      "access": "private",
      "backup_rule": {},
      "backups": {
         "backup": []
      },
      "license": 0,
      "part_of_plan": "",
      "servers": {
         "server": [
            ""
         ]
      },
      "size": ,
      "state": "online",
      "tier": "",
      "title": "",
      "type": "",
      "uuid": "",
      "zone": ""
   }
}

Когда я выполняю этот код:

bkpdet = requests.get('https://fffff.com/1.2/storage/08475', auth=HTTPBasicAuth('login', 'pass'))
bkpdet_json = bkpdet.json()
datastg = bkpdet.json()
print(datastg)
for sts in datastg['storage']:
    bkpsts = sts['state']
    print(bkpsts)

Я получаю эту ошибку:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: string indices must be integers

Вся идея заключается в том, чтобы в конце получить информацию о статусе, используя этот код:

if bkpsts == "online":
    print('Backup has been created.')
else bkpsts == "backuping":
    print('Backup creation is in progress.')
else:
    print(bkpdet.status_code)

Я искал, но все еще не могу найти, что здесь не так.

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Вам не хватает ключа, когда вы хотите получить доступ к хранилищу, вы зацикливаетесь на нем, и это нормально. Но в каждой итерации вы получаете словарь, из которого вам нужно вызвать правильный ключ, в вашем случае предпочтительнее использовать метод storage.

for storage in datas['server']['storage_devices']['storage_device']: 
    srvstorage = storage.get("storage", None) 
    print(srvstorage)

Note

get. так как вы можете столкнуться с устройством без внутренней информации о хранилище, с помощью get вы можете избежать KeyError.

1 голос
/ 29 октября 2019

Вы можете просто сделать

for device in datas['server']['storage_devices']['storage_device']:
    device_storage = device['storage']
    print(device_storage)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...