优化python函数获取多级json属性

时间:2016-07-29 00:01:03

标签: python json python-2.7 flask flask-restful

我有一个3级json文件。我从json的3个级别中的每个级别获取一些属性的值。目前,我的代码执行时间很可怜,因为在我的网页上花费大约2-3分钟才能得到结果。我将有一个更大的json文件来处理生产。

我是python和flask的新手,并没有做过很多网页编程。请建议我如何优化我的下面的代码!感谢您的帮助,非常感谢。

import json
import urllib2
import flask
from flask import request
def Backend():
    url = 'http://localhost:8080/surveillance/api/v1/cameras/'
    response = urllib2.urlopen(url).read()
    response = json.loads(response)
    components = list(response['children'])
    urlComponentChild = []
    for component in components:
        urlComponent = str(url + component + '/')
        responseChild = urllib2.urlopen(urlComponent).read()
        responseChild = json.loads(responseChild)
        camID = str(responseChild['id'])
        camName = str(responseChild['name'])
        compChildren = responseChild['children']
        compChildrenName = list(compChildren)
        for compChild in compChildrenName:
                href = str(compChildren[compChild]['href'])
                ID = str(compChildren[compChild]['id'])
                urlComponentChild.append([href,ID])
    myList = []
    for each in urlComponentChild:
        response = urllib2.urlopen(each[0]).read()
        response = json.loads(response)
        url = each[0] + '/recorder'
        responseRecorder = urllib2.urlopen(url).read()
        responseRecorder = json.loads(responseRecorder)
        username = str(response['subItems']['surveillance:config']['properties']['username'])
        password = str(response['subItems']['surveillance:config']['properties']['password'])
        manufacturer = str(response['properties']['Manufacturer'])
        model = str(response['properties']['Model'])
        status = responseRecorder['recording']
        myList.append([each[1],username,password,manufacturer,model,status])
    return myList
APP = flask.Flask(__name__)
@APP.route('/', methods=['GET', 'POST'])
def index():
    """ Displays the index page accessible at '/'
    """
    if request.method == 'GET':
        return flask.render_template('index.html', response = Backend())
if __name__ == '__main__':
    APP.debug=True
    APP.run(port=62000)

1 个答案:

答案 0 :(得分:0)

好的,缓存。因此,我们要做的是根据我们已有的数据立即开始向用户返回值,而不是每次都生成新数据。这意味着用户获得的最新数据可能比理论上可能获得的数据略少,但这意味着他们收到的数据会在您使用的系统中尽可能快地接收到。

因此我们将保持您的后端功能不变。就像我说的那样,你当然可以通过多线程加速它(如果你仍然对它感兴趣,10秒版本就是我会使用grequests从URL列表中异步获取数据。)

但是,每次用户请求数据时,我们不会在每次用户请求数据时调用它来响应用户,而是每隔一段时间调用一次。这几乎肯定是你最终想要做的事情,因为这意味着你不必为每个用户生成全新的数据,这是非常浪费的。我们只是将一些数据保存在一个变量中,尽可能多地更新该变量,并在每次获得新请求时返回该变量中的任何数据。

from threading import Thread
from time import sleep

data = None

def Backend():
    .....

def main_loop():
    while True:
        sleep(LOOP_DELAY_TIME_SECONDS)
        global data
        data = Backend()

APP = flask.Flask(__name__)
@APP.route('/', methods=['GET', 'POST'])
def index():
    """ Displays the index page accessible at '/'
    """
    if request.method == 'GET':
        # Return whatever data we currently have cached
        return flask.render_template('index.html', response = data)
if __name__ == '__main__':
    data = Backend() # Need to make sure we grab data before we start the server so we never return None to the user
    Thread(target=main_loop).start() #Loop and grab new data at every loop
    APP.debug=True
    APP.run(port=62000)

免责声明:我之前使用Flask和线程进行过一些项目,但我根本不是它的专家或网络开发。在将此代码用于任何重要事项之前测试此代码(或者更好的是,找到知道他们在使用它之前做任何重要事情的人)

编辑:数据必须是全局的,抱歉 - 因此免责声明