【问题标题】:Parsing JSON data from API using Flask?使用 Flask 从 API 解析 JSON 数据?
【发布时间】:2018-10-10 16:54:14
【问题描述】:

我正在尝试从 API 解析一些数据,然后通过 Flask Web 应用程序剥离并仅显示所需的信息。这似乎是我学习的一个很好的用例,构建一个本质上充当 API 接口的 Flask Web 应用程序。

这是我开始使用的脚本:

# !/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: 

显然,由于各种嵌套的字典列表,我无法正确访问数据。

我认为这应该是相当接近和可行的,只是没有正确解析数据。

任何帮助将不胜感激。

【问题讨论】:

    标签: python json flask


    【解决方案1】:

    不确定与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 %}
    

    参见模板中的 cmets。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 1970-01-01
      • 2016-08-27
      • 2018-01-18
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      相关资源
      最近更新 更多