Если вы хотите выполнить это как команду Ansible ad-hoc, вы можете сделать следующее:
$ password='SomethingSecret!'
$ ansible 192.168.1.10 -i some_inventory -b -m user -a "name=joe_user \
update_password=always password=\"{{ \"$password\" | password_hash('sha512') }}\""
Выход из команды:
192.168.1.10 | SUCCESS => {
"append": false,
"changed": true,
"comment": "Joe User",
"group": 999,
"home": "/home/joe_user",
"move_home": false,
"name": "joe_user",
"password": "NOT_LOGGING_PASSWORD",
"shell": "/bin/bash",
"state": "present",
"uid": 999
}
Хорошо, я сначала начну с кода, а затем объясню его.
import request import json
def get_and_print_data(url):
r = requests.get(url)
info = r.json()
for i in info['results']:
print(i['name'])
if info.get('next'):
get_and_print_data(info['next'])
get_and_print_data("https://swapi.co/api/people/")
Код здесь довольно плохой, так как этот метод слишком много делает (получает данные, обрабатывает их, определяет, есть ли следующие страницы и печатает ли данные). Это слишком много логики только для одной функции, но для нашего примера это нормально.
Итак, обо всем по порядку, почему функция? Потому что нам нужно выполнять одни и те же действия (получать, обрабатывать и печатать данные) несколько раз. раз, по одному на страницу. Что меняется? URL, так как для каждой страницы есть разные URL. Таким образом, у нас будет URL в качестве параметра этой функции.
Следующие несколько строк взяты из вашего кода, так что Я предполагаю, что вы знакомы с ними. Тогда у нас есть эта важная строка: if info.get('next'):
В словарях вы обычно извлекаете данные с помощью dictionary[key]
, и это вызывает и исключение, если ключ не существует, называется KeyError . В этом случае мы должны были использовать попытку / кроме проверки наличия ключа next . Даже если это считается более «питоническим» способом, этот с «если» может быть легче понять.
Что тогда делает .get('next')
? Ну, почти то же самое, но вместо броска и исключения он просто вернет None
, если ключа нет, и помнит, что в Python None
оценивается как ложное.
Короче говоря, это проверит, присутствует ли в вашем ответе ключ next (вы можете видеть, что API возвращает ноль для отсутствующих данных). Если ключ присутствует, мы будем вызывать ту же функцию с URL для следующей страницы и повторять до тех пор, пока в возвращенном JSON не будет отсутствовать (или будет отсутствовать) следующий ключ.
Конечно, нам нужно будет вызвать нашу функцию с начальным URL-адресом и продолжить с этого момента:)
Надеюсь, это поможет, и все легко понять!
Мое решение:
import requests
import json
def query_api(url):
r = requests.get(url)
info = r.json()
return info['next'], info['results']
n, r = query_api("https://swapi.co/api/people/")
while n:
for i in r:
print(i['name'])
n, r = query_api(n)
Кроме того, если вы играете с такими API, вы можете взглянуть на request-cahce , который вы можете включить в Ваш код для кэширования результатов API локально, так что вы можете запускать повторные запросы, не превышая ограничения скорости. (И, конечно, быть внимательным к владельцу API).