我有一个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)
答案 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和线程进行过一些项目,但我根本不是它的专家或网络开发。在将此代码用于任何重要事项之前测试此代码(或者更好的是,找到知道他们在使用它之前做任何重要事情的人)
编辑:数据必须是全局的,抱歉 - 因此免责声明