python - Run function on Flask server every x seconds to update Redis cache without clients making separate calls -
i have flask app makes call s3 external api following structure before rendering data in javascript:
from flask import flask, render_template,make_response flask import request import requests import requests_cache import redis boto3.session import session import json app = flask(__name__) @app.route('/test') def test1(): bucket_root = 'testbucket' session = session( aws_access_key_id='s3_key', aws_secret_access_key='s3_secret_key') s3 = session.resource('s3') bucket = s3.bucket(bucket_root) testvalues = json.dumps(s3.object(bucket_root,'all1.json').get()['body'].read()) r = requests.get(api_link) return render_template('test_html.html',json_s3_test_response=r.content, limit=limit, testvalues=testvalues) @app.route('/test2') def test2(): bucket_root = 'testbucket' session = session( aws_access_key_id='s3_key', aws_secret_access_key='s3_secret_key') s3 = session.resource('s3') bucket = s3.bucket(bucket_root) testvalues = json.dumps(s3.object(bucket_root,'all2.json').get()['body'].read()) r = requests.get(api_link) return render_template('test_html.html',json_s3_test_response=r.content, limit=limit, testvalues=testvalues) @app.errorhandler(500) def internal_error(error): return "500 error" @app.errorhandler(404) def not_found(error): return "404 error",404 @app.errorhandler(400) def custom400(error): return "400 error",400 //catch all? @app.errorhandler(exception) def all_exception_handler(error): return 'error', 500
obviously have lot of inefficiencies here, main question is:
to me seems i'm calling s3 , external api each client, every time refresh page. increases chance app crash due timeouts (and poor error handling) , diminishes performance. resolve periodically caching s3 results (say every 10 mins) local redis server (already set , running) pinging external api once server every few seconds before passing onto clients.
i have code can store data redis every 10 mins in regular python script, however, i'm not sure place within flask server? put it's own function or keep call redis in @app.route()?
thank time , effort. appreciated! i'm new flask of has been confusing.