flask-cache扩展有一个@cache.memoize装饰器来缓存一个视图,包括视图的*args和**kwargs。然而,我的一些视图也接受URL查询字符串,例如/foo/image?width=640。装饰器将make_cache_key方法添加到装饰性视图函数中,该方法可用于自定义缓存键
但是,我不知道如何在正常的请求上下文之外获取request.args。
你有什么办法让@cache.memoize也能处理URL查询字符串吗?
发布于 2017-11-08 22:06:05
您可以使用flask-caching
Flask-Cache扩展的
延续
你可以用它来做类似这样的事情:
@app.route("/")
@cache.cached(timeout=10, query_string=True)
def index():
return render_template('index.html')来自source code的文档:
:param query_string: Default False. When True, the cache key
used will be the result of hashing the
ordered query string parameters. This
avoids creating different caches for
the same query just because the parameters
were passed in a different order. See
_make_cache_key_query_string() for more
details.发布于 2013-01-11 01:49:14
我今天遇到了同样的问题,在网上找不到任何例子,所以我玩了一下。
这是我的make_cache_key:
def make_cache_key(*args, **kwargs):
path = request.path
args = str(hash(frozenset(request.args.items())))
lang = get_locale()
return (path + args + lang).encode('utf-8')您可以使用request.url代替path和散列参数。我还需要将用户语言添加到键中。
缓存视图:
@app.route("/test")
@cache.cached(timeout=50)
def test():
a = request.args.get('a')
b = request.args.get('b')
return a + b
test.make_cache_key = make_cache_key它是有效的,但我认为它有点麻烦。事实证明,key_prefix可以是一个生成整个cache_key的可调用函数。因此,我们可以这样做:
@app.route("/test2")
@cache.cached(timeout=50, key_prefix=make_cache_key)
def test2():
a = request.args.get('a')
b = request.args.get('b')
return a + b我只是想出了这一点,还没有在生产中使用它-所以它可能不会在所有情况下都起作用。
发布于 2013-08-27 01:20:09
从0.3.4版本开始,key_prefix可以是一个可调用的:
版本0.3.4中的新特性:可以选择是一个不带参数但返回一个将用作cache_key的字符串的callable。
这是文档:Flask-Cache
https://stackoverflow.com/questions/9413566
复制相似问题