Python 如何在模板错误时跳过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

我在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 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)
捕获异常,并优雅地显示错误。