Ошибка при попытке доступа к данным через API с использованием Python - PullRequest
2 голосов
/ 29 октября 2019

Я получаю сообщение об ошибке при попытке доступа к сведениям о хранилище серверов с помощью API. Я хочу извлечь резервную копию состояния, которое состояние в 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)

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

Ответы [ 3 ]

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

Когда вы используете:

for sts in datastg['storage']:

sts будет ключ строки. Вы пытаетесь рассматривать его как словарь.

Если вам просто нужно значение state, вы можете получить к нему прямой доступ:

datastg['storage']['state']

Если вы хотите выполнить итерацию всех пар ключ-значениев storage вы можете использовать items() как для ключа, так и для значения.

for key, value in datastg['storage'].items():
    print(key,":", value)
1 голос
/ 29 октября 2019

Как советовал @MarkMeyer, я изменил код следующим образом:

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

Он отлично работает!

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

Код ниже работает

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

state = data['storage']['state']
print(state)

вывод

online
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...