flask-cache memoize URL查询字符串参数

Adr*_*ian 20 python flask

flask-cache扩展有一个@cache.memoize装饰器来缓存视图,包括视图*args**kwargs.但是,我的一些视图也会使用URL查询字符串/foo/image?width=640.装饰器make_cache_key向装饰视图函数添加一个方法,该方法可用于自定义缓存键

但是我不知道如何获得request.args正常请求上下文的外部.

有关如何@cache.memoize使用URL查询字符串的任何想法吗?

Smo*_*moe 29

我今天遇到了同样的问题,并没有在互联网上找到任何例子,所以我玩了一下.

这是我的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')
Run Code Online (Sandbox Code Playgroud)

您可以使用request.url而不是path和散列的args.我还需要将用户语言添加到密钥中.

缓存视图:

@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
Run Code Online (Sandbox Code Playgroud)

它有效,但我认为这有点麻烦.事实证明,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
Run Code Online (Sandbox Code Playgroud)

我刚刚想出了这个并且尚未在生产中使用它 - 所以它可能无法在所有情况下使用.

  • 谢谢!这对我有用:`def make_cache_key(*args,**kwargs):return request.url` (7认同)

Eya*_*vin 17

你可以使用flask-caching:

继续Flask-Cache扩展

你可以用它做这样的事情:

@app.route("/")
@cache.cached(timeout=10, query_string=True)
def index():
    return render_template('index.html')
Run Code Online (Sandbox Code Playgroud)

来自源代码的文档:

: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.
Run Code Online (Sandbox Code Playgroud)