使用Flask-Cache缓存非视图函数的结果

4

我希望使用Flask-Cache来缓存一个不是视图函数的函数的结果。然而,它似乎只能在装饰视图函数时使用。Flask-Cache能用于缓存“普通”的函数吗?

如果我装饰一个视图函数,缓存就会起作用。

cache = Cache(app,config={'CACHE_TYPE': 'simple'})

@app.route('/statistics/', methods=['GET'])
@cache.cached(timeout=500, key_prefix='stats')
def statistics():
    return render_template('global/application.html') # caching works here

如果我装饰一个“普通”函数并从视图中调用它,它将无法正常工作。

class Foo(object):
    @cache.cached(timeout=10, key_prefix='filters1')
    def simple_method(self):
        a = 1
        return a  # caching NOT working here  



@app.route('/statistics/filters/', methods=['GET'])
def statistics_filter():
    Foo().simple_method()

如果我在两个函数中使用相同的key_prefix,它也可以工作。我认为这是一个线索,说明缓存本身被正确初始化了,但我调用简单方法或定义它的方式可能有误。


你最终解决了这个问题吗?我认为这个链接可以解决你的问题(但不是我的)- https://stackoverflow.com/questions/55474340/python-flask-opencv-how-do-i-cache-an-arbitrary-opencv-object-between-request - jtlz2
1个回答

0

我认为你需要在你的simple_method中返回一些内容,这样Flask-Cache才能缓存返回值。我怀疑它不会自己找出需要缓存的方法变量。

另外一个问题是,你需要一个单独的函数来计算和缓存你的结果,像这样:

def simple_method(self):
    @cache.cached(timeout=10, key_prefix='filters1')
    def compute_a():
        return a = 1
    return compute_a()

如果你想要缓存这个方法,可以使用memoize


感谢 @user1537085 的回答,虽然返回了一个值但仍未缓存。 - WebQube

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接