Парсинг данных JSON из API с помощью Flask? - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь проанализировать некоторые данные из 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: 

Очевидно, у меня возникают проблемы с правильным доступом к данным из-за различных вложенных списков диктов.

Я бы подумал, что это должно быть достаточно близко и выполнимо, просто неправильно обрабатывая данные.

Любая помощь будет принята.

1 Ответ

0 голосов
/ 12 октября 2018

Не уверен, что проблема связана с parsing.Вероятно, ваша проблема связана с jinja + rendering.

app.py

app = Flask(__name__)
app.config['SECRET_KEY'] = 'topsecret!'
# your data c.slb.virtual_server.all()
data_from_server = {"virtual_server_list": ...}

with app.app_context():
    print(render_template(
       'srvlist.html',
       template_data=data_from_server['virtual_server_list']))

templates / srvlist.html

{% block content %}
    {#  template_data is a list  #}
    {#  example data:
        template_data = [
        {
            'name': 'n1',
            'address': 'a1',
            'vport_list': [
            {
               'vport_name': 'vp1',
               'service_group': 'group1',
               'port': 8000
             }]
        }]
    #}
    {% for row in template_data %}
        {#  row is a dict - {'name': 'val', 'address': 'val'}  #}
        VIP Name: {{ row['name'] }}
        VIP Address: {{ row['address'] }}
        {#  row['vport_list'] is a list  #}
        {% for port in row['vport_list'] %}
            {#  port is a dict - {'vport_name': 'val', 'service_group': 'val', 'port': 8000} #}
            VPort Name: {{ port['vport_name'] }}
            Service Group: {{ port['service_group'] }}
            Port: {{ port['port'] }}
        {% endfor %}
    {% endfor %}
{% endblock %}

См. Комментарии в шаблоне.Надеюсь, это поможет.

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