Python для печати элемента в списке из сообщения JSON - PullRequest
0 голосов
/ 18 сентября 2018

Я использую Python 3.7 Flask RestFul У меня есть данные, отправляемые в формате json в мое приложение Api Flask.данные, которые я получаю, выглядят следующим образом:

{'username': 'admin', 'password': 'mypassword', 'host': [{'address': '192.168.2.5', 'config': 'set system host-name device01', 'address': '192.168.2.2', 'config': 'set system host-name device02'}]}

список 'хост': может быть до нескольких сотен устройств / IP-адрес

Мне нужно проанализировать список и распечататьтолько IP-адрес и Config, поэтому мне нужно, чтобы он был:

192.168.2.5
192.168.2.2

и т. д .... чтобы я мог пройти через список IP-адресов и подключиться к устройству и применить конфигурацию, котораябудет отличаться для каждого устройства.

Структура, которая мне понадобится взамен, чтобы я мог выполнить цикл и подключиться к IP-адресу устройства, а затем применить конфигурацию ...

192.168.2.5
set system host-name device01

192.168.2.2
set system host-name device02

IP-адрес будет = IPS и конфиг будет = config

мой код Python ниже ...

app = Flask(__name__)
api = Api(app)

class build(Resource):

def post(self):

    data = request.get_json(force=True)
    print(data)
    jobname = data['jobname']
    username = data['username']
    password = data['password']
    configs = []
    ips = []
    for x in data['host']:
        if 'address' in x:
            ips.append(x['address'])
        elif 'config' in x:
            configs.append(x['config'])
    commands = zip(ips, configs)
    for command in commands:
        iplist = '{}'.format(command[0])
        print(iplist)
        conf = '{}'.format(command[1])
        print(conf)

        # Connect to Device and load config
        dev = Device(host=iplist, user=username, passwd=password)
        dev.open()
        print("connect to %s " % iplist)
        dev.timeout = 600
        #print(dev.cli("show version"))
        dev.bind(cfg=Config)
        dev.cfg.load(conf, format='set', merge=True)
        dev.cfg.commit()
        dev.close()

api.add_resource(build, '/build')

if __name__ == '__main__':
app.debug = True
app.run(host='0.0.0.0', port=5000)

1 Ответ

0 голосов
/ 18 сентября 2018

Предполагается, что адрес и конфиги в порядке.Кто бы ни предоставлял вам данные или выводил данные, мог бы объединить адрес и настройки, делая это намного безопаснее и проще.

import gevent

data = request.get_json(force=True)

def execute(username, password, command):
    command = command[0]
    dev = Device(host=command, user=username, passwd=password)
    dev.open()
    print("connect to %s " % command)
    dev.timeout = 600
    print(dev.cli("show version"))
    dev.bind(cfg=Config)
    dev.cfg.load(command, format='set', merge=True)
    dev.cfg.commit()
    dev.close()

commands = []
data = {'username': 'admin', 'password': 'mypassword', 'host': [{'address': '192.168.2.5','config': 'set system host-name device01'}, {'address': '192.168.2.2','config': 'set system host-name device02'}]}
username = data['username']
password = data['password']

for x in data['host']:
    if 'address' in x:
        commands.append((x['address'],x['config']))

threads = [gevent.spawn(execute, username, password, command) for command in commands]
gevent.joinall(threads)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...