小编典典

flask-cache还可以记住URL查询字符串参数

flask

flask-cache扩展具有@cache.memoize装饰器,用于缓存包含视图的*args和的视图**kwargs。但是,我的某些视图也采用了URL查询字符串,例如/foo/image?width=640。装饰器make_cache_key在装饰后的视图函数中添加一种方法,可用于自定义缓存键

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

有什么想法也可以@cache.memoize使用URL查询字符串吗?


阅读 699

收藏
2020-04-06

共1个答案

小编典典

31

我今天遇到了同样的问题,在互联网上找不到任何示例,所以我玩了一些。

这是我的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

我只是想出了这一点,还没有在生产中使用它-因此它可能无法在所有情况下都起作用。

2020-04-06