Python 如何在模板错误时跳过Flask缓存
我在Redis服务器上使用带模板缓存的Flask:Python 如何在模板错误时跳过Flask缓存,python,flask,redis,Python,Flask,Redis,我在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["CACH
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 decorator,比如
@cache.memoize(timeout=TIMEOUT)
def update_date():
return manager.getData()
问题是,当manager.getData()
有错误或没有数据时,装饰程序无论如何都会缓存响应。如何避免呢
[更新]
我尝试过使用,除非
参数,根据文档,它应该是
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
是一个单例实例,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
但它似乎并没有像预期的那样起作用
问题是,当manager.getData()有错误或没有数据时,装饰程序无论如何都会缓存响应。如何避免呢
你查过了吗?如果您查看(我假设您使用的是
flask缓存
,因为flask缓存
没有维护超过4年),如果您从缓存(rv
值)获得None
),您不使用它,则调用f
函数。如果f
函数引发异常,则不会将任何内容保存到缓存。好,因此基本上getData
可以引发自定义错误,如raisevalueerror('no data available')
。是的,您可以通过@app.errorhandler(exception)
捕获异常,并优雅地显示错误。