我在Redis服务器上使用带有模板缓存的Flask:
TIMEOUT = 60 * 60
cache = Cache(app.server, config={
'CACHE_TYPE': 'redis',
'CACHE_REDIS_HOST': "myredis",
'CACHE_DEFAULT_TIMEOUT': TIMEOUT,
'CACHE_REDIS_PORT': 6379,
})
# to disable caching
#app.config["CACHE_TYPE"] = "null"
然后使用@cache装饰器之类的
@cache.memoize(timeout=TIMEOUT)
def update_date():
return manager.getData()
问题在于,当manager.getData()
有错误或没有数据时,装饰器将始终缓存响应。如何避免呢?
[更新]
我尝试使用unless
参数,根据文档,它应该是
unless – Default None. Cache will always execute the caching facilities unelss this callable is true. This will bypass the caching entirely.
如此使用
@cache.memoize(timeout=TIMEOUT unless=DataLoader.instance.hasData)
def update_date():
return manager.getData()
其中DataLoader
是一个Singleton实例,如果没有数据,hasData
方法将返回None
,如果有数据则返回True
,因此方法getData
将计算数据并返回实例变量self.data
,该变量始终保存最后计算的数据或None
。
class DataLoader(SingletonMixin):
def __init__(self):
self.data=None
def hasData(self):
if self.data is Not None:
return True
else:
return None
def getData(self):
# calculate data
res = self.computeData()
if res is not None:
self.data=res
return self.data
但似乎无法按预期工作。