commit 970e65d414f3511674701ca31983a98837ba5b39 Author: Marcel Nijenhof Date: Sun Jan 19 14:10:12 2020 +0100 Initial commit diff --git a/fc-example b/fc-example new file mode 100755 index 0000000..c0da9f7 --- /dev/null +++ b/fc-example @@ -0,0 +1,43 @@ +#!/usr/bin/python3 + +from flask import Flask, escape, request +from time import sleep, time, ctime +from flaskcache import FlaskCache + +app = Flask(__name__) +fc = FlaskCache() + +def page(name, count, delta=0.2): + page= ( + "\n" + "\n" + "\n" + " \n" + " %s<title/>\n" + "</head>\n" + "<body>\n" + "<h1>%s<s/h1>\n" + "<h2>time</h2>\n" + " %f<br />\n" + " %s<br />\n" + "<h2>data</h2>\n" + ) % (name, name, time(), ctime()) + for i in range(1, count+1): + page += " %i<br />\n" % i + sleep(delta) + page += ( + "</body>\n" + "</html>\n" + ) + return(page) + +@app.route('/p1') +def p1(): + return(fc.getpage("/p1", page, "p1", 5)) + +@app.route('/p2') +def p2(): + return(fc.getpage("/p2", page, "p2", 10, 0.5)) + +if __name__ == '__main__': + app.run() diff --git a/flaskcache.py b/flaskcache.py new file mode 100644 index 0000000..e73dd5b --- /dev/null +++ b/flaskcache.py @@ -0,0 +1,38 @@ +from time import time +from threading import Lock + +class FlaskCache: + def __init__(self, timeout=20): + self.timeout = timeout + self.cache = {} + self.lock = {} + + def genpage(self, pagefunc, *args): + page = {} + try: + page["page"] = pagefunc(*args) + page["code"] = 200 + except Exception as e: + page["page"] = "ERROR\n" + page["code"] = 500 + page["time"] = time() + return(page) + + def cachetime(self, pagename): + try: + delta = self.cache[pagename]["time"] + self.timeout - time() + except Exception as e: + delta = -1 + return(delta) + + def getpage(self, pagename, pagefunc, *args): + if pagename not in self.cache: + self.cache[pagename] = {} + if pagename not in self.lock: + self.lock[pagename] = Lock() + if (self.cachetime(pagename) <= 0): + self.lock[pagename].acquire() + if (self.cachetime(pagename) <= 0): + self.cache[pagename] = self.genpage(pagefunc, *args) + self.lock[pagename].release() + return(self.cache[pagename]["page"], self.cache[pagename]["code"])