From 03ca988d43203b3de77d8e69c173f1c419920b90 Mon Sep 17 00:00:00 2001 From: Yuriy Taraday Date: Tue, 19 Aug 2014 00:25:22 +0400 Subject: [PATCH] Allow cliend-side caching Add Expires and Cache-Control headers to API responses. This allows browsers to cache them and avoid extra round-trips for data. Also use plain JSON type in UI to allow browser to use cache. For widget to work added "Access-Control-Allow-Origin: *" header to all API requests. Note that althogh this will make cross-origin requests work, it's still not enough to make browser cache such response, so widget won't benefit from client-side caching yet. Change-Id: I49eeffccaf79fe3417bd941590b5dd239ddc433f --- stackalytics/dashboard/decorators.py | 15 ++++++++++++++- .../dashboard/static/js/stackalytics-ui.js | 4 ++-- stackalytics/dashboard/vault.py | 5 +++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/stackalytics/dashboard/decorators.py b/stackalytics/dashboard/decorators.py index 4dddb0119..65c2f8e7e 100644 --- a/stackalytics/dashboard/decorators.py +++ b/stackalytics/dashboard/decorators.py @@ -17,6 +17,7 @@ import cProfile import functools import json import operator +import time import flask from oslo.config import cfg @@ -483,7 +484,19 @@ def response(): else: mimetype = 'application/json' - return flask.current_app.response_class(data, mimetype=mimetype) + resp = flask.current_app.response_class(data, mimetype=mimetype) + update_time = vault.get_vault()['vault_next_update_time'] + now = utils.date_to_timestamp('now') + if now < update_time: + max_age = update_time - now + else: + max_age = 0 + resp.headers['cache-control'] = 'public, max-age=%d' % (max_age,) + resp.headers['expires'] = time.strftime( + '%a, %d %b %Y %H:%M:%S GMT', + time.gmtime(vault.get_vault()['vault_next_update_time'])) + resp.headers['access-control-allow-origin'] = '*' + return resp return response_decorated_function diff --git a/stackalytics/dashboard/static/js/stackalytics-ui.js b/stackalytics/dashboard/static/js/stackalytics-ui.js index 54ccc1bc5..485ae7898 100644 --- a/stackalytics/dashboard/static/js/stackalytics-ui.js +++ b/stackalytics/dashboard/static/js/stackalytics-ui.js @@ -89,7 +89,7 @@ function renderTableAndChart(url, container_id, table_id, chart_id, link_param, $.ajax({ url: makeURI(url), - dataType: "jsonp", + dataType: "json", success: function (data) { var tableData = []; @@ -325,7 +325,7 @@ function initSingleSelector(name, api_url, select2_extra_options, change_handler $.ajax({ url: api_url, - dataType: "jsonp", + dataType: "json", success: function (data) { var initial_value = getUrlVars()[name]; if (initial_value) { diff --git a/stackalytics/dashboard/vault.py b/stackalytics/dashboard/vault.py index 5f0383fba..9c15b5bd0 100644 --- a/stackalytics/dashboard/vault.py +++ b/stackalytics/dashboard/vault.py @@ -71,11 +71,12 @@ def get_vault(): if not getattr(flask.request, 'stackalytics_updated', None): time_now = utils.date_to_timestamp('now') - may_update_by_time = (time_now > vault.get('vault_update_time', 0) + - cfg.CONF.dashboard_update_interval) + may_update_by_time = time_now > vault.get('vault_next_update_time', 0) if may_update_by_time: flask.request.stackalytics_updated = True vault['vault_update_time'] = time_now + vault['vault_next_update_time'] = ( + time_now + cfg.CONF.dashboard_update_interval) memory_storage_inst = vault['memory_storage'] have_updates = memory_storage_inst.update(compact_records( vault['runtime_storage'].get_update(os.getpid())))