Я пытаюсь проанализировать некоторые данные из API, чтобы затем удалить их и представить только необходимую информацию через веб-приложение Flask.Мне кажется, что это хороший пример использования для создания веб-приложения Flask, которое по сути выступает в качестве интерфейса к API.
Это сценарий, с которого я начал:
# !/usr/bin/env python
from __future__ import print_function
from functools import wraps
from flask import Flask, Response, request, jsonify, render_template, Request, json
from flask_bootstrap import Bootstrap
import time
import acos_client as acos
app = Flask(__name__)
app.config['SECRET_KEY'] = 'topsecret!'
bootstrap = Bootstrap(app)
c = acos.Client('1.2.3.4', acos.AXAPI_21, 'admin', 'password')
def get_sl1():
result = {}
sl1 = c.slb.virtual_server.all()
result['x'] = sl1['virtual_server_list'][0]
result['y'] = sl1['virtual_server_list'][0]['vport_list'][0]
return (sl1, result)
@app.route('/', methods=['GET','POST'])
def index():
sl1, sl1_dict = get_sl1()
return render_template('srvlist.html', x=sl1_dict['x'], y=sl1_dict['y'], sl1=sl1)
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
Главное - понимать данные, которые я получаю и сохраняю как «sl1»:
{
"virtual_server_list": [
{
"status": 1,
"disable_vserver_on_condition": 0,
"name": "VS_01",
"vip_template": "default",
"pbslb_template": "",
"vrid": 0,
"redistribution_flagged": 0,
"extended_stats": 0,
"ha_group": {
"status": 1,
"ha_group_id": 1,
"dynamic_server_weight": 0
},
"arp_status": 1,
"address": "10.10.10.1",
"vport_list": [
{
"protocol": 2,
"sync_cookie": {
"sync_cookie": 0,
"sack": 0
},
"snat_against_vip": 0,
"received_hop": 0,
"vport_template": "default",
"tcp_template": "",
"send_reset": 0,
"port": 143,
"service_group": "SG.IMAP.SITE.COM_143",
"vport_acl_id": 0,
"extended_stats": 0,
"source_nat": "",
"aflex_list": [],
"status": 1,
"direct_server_return": 0,
"ip_in_ip": 0,
"source_ip_persistence_template": "",
"default_selection": 1,
"vport_name": "IMAP.SITE.COM_143",
"auto_source_nat_precedence": 0,
"ha_connection_mirror": 0,
"connection_limit": {
"status": 0
},
"auto_source_nat": 0,
"pbslb_template": "",
"stats_data": 1,
"acl_natpool_binding_list": []
},
{
"protocol": 13,
"sync_cookie": {
"sync_cookie": 0,
"sack": 0
},
"snat_against_vip": 0,
"received_hop": 0,
"vport_template": "default",
"send_reset": 0,
"port": 993,
"service_group": "SG_IMAP.SITE.COM_993",
"vport_acl_id": 0,
"extended_stats": 0,
"source_nat": "",
"server_ssl_template": "",
"aflex_list": [],
"status": 1,
"client_ssl_template": "imap.site.com_2018",
"source_ip_persistence_template": "",
"default_selection": 1,
"vport_name": "IMAP.SITE.COM_993",
"auto_source_nat_precedence": 0,
"tcp_proxy_template": "",
"connection_limit": {
"status": 0
},
"auto_source_nat": 0,
"pbslb_template": "",
"stats_data": 1,
"acl_natpool_binding_list": []
}
],
"stats_data": 1
},
{
"status": 1,
"disable_vserver_on_condition": 0,
"name": "VS_02",
"vip_template": "default",
"pbslb_template": "",
"vrid": 0,
"redistribution_flagged": 0,
"extended_stats": 0,
"ha_group": {
"status": 1,
"ha_group_id": 1,
"dynamic_server_weight": 0
},
"arp_status": 1,
"address": "10.10.10.2",
"vport_list": [
{
"protocol": 2,
"sync_cookie": {
"sync_cookie": 0,
"sack": 0
},
"snat_against_vip": 0,
"received_hop": 0,
"vport_template": "default",
"tcp_template": "",
"send_reset": 0,
"port": 25,
"service_group": "SG_LAB_25",
"vport_acl_id": 0,
"extended_stats": 0,
"source_nat": "",
"aflex_list": [],
"status": 1,
"direct_server_return": 0,
"ip_in_ip": 0,
"source_ip_persistence_template": "",
"default_selection": 1,
"vport_name": "LAB_25",
"auto_source_nat_precedence": 0,
"ha_connection_mirror": 0,
"connection_limit": {
"status": 0
},
"auto_source_nat": 0,
"pbslb_template": "",
"stats_data": 1,
"acl_natpool_binding_list": []
}
],
"stats_data": 1
}
]
}
Мой шаблон Flask выглядит следующим образом:
{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}A10 Server List{% endblock %}
{% block navbar %}
<nav class="navbar navbar-inverse" role="navigation">
<div class="container">
<a class="navbar-brand" href="{{ url_for('index') }}">A10 Server List</a>
</div>
</nav>
{% endblock %}
{% block content %}
<div class="container">
<div class="row">
<div class="col">
{% for row in x %}
<tr>
<td><b>VIP Name: {{ row['name'] }}</td></b>
<td><b>VIP Address: {{ row['address'] }}</b></td>
</tr><br><BR>
{% endfor %}
{% for row in y %}
<tr>
<td>VPort Name: {{ row['vport_name'] }}</td>
<td>Service Group: {{ row['service_group'] }}</td>
<td>Port: {{ row['port'] }}</td>
</tr><BR>
{% endfor %}
</div>
</div>
</div>
{% endblock %}
Я ожидал следующих результатов:
VIP Name: VS_01 VIP Address: 10.10.10.1
VPort Name: IMAP.SITE.COM_143 Service Group: SG.IMAP.SITE.COM_143 Port: 143
VPort Name: IMAP.SITE.COM_993 Service Group: SG_IMAP.SITE.COM_993 Port: 993
VIP Name: VS_02 VIP Address: 10.10.10.2
VPort Name: LAB_25 Service Group: SG_LAB_25 Port: 25
Однако то, что я получил, было просто пустым:
VIP Name: VIP Address:
VIP Name: VIP Address:
VPort Name: Service Group: Port:
VPort Name: Service Group: Port:
VPort Name: Service Group: Port:
Очевидно, у меня возникают проблемы с правильным доступом к данным из-за различных вложенных списков диктов.
Я бы подумал, что это должно быть достаточно близко и выполнимо, просто неправильно обрабатывая данные.
Любая помощь будет принята.