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"])