Я использую Flask с кэшированием шаблонов на сервере Redis:
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()
содержит ошибки или не содержит данных, декоратор все равно будет кэшировать ответ. Как этого избежать?
[UPDATE]
Я попытался использовать параметр 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
будет вычислять данные и возвращать переменную экземпляра * 1026. * который всегда содержит последние вычисленные данные или 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
но похоже, что он работает не так, как ожидалось.