在 Flask 路由缓存中存储计算

Storing a calculation in a flask route cache

我有一个很长的任务进入 python-rq 工作队列。

@cache.cached(timeout=2592000)
@app.route('/as/<keyword>', methods=['GET'])
@db_session
def auto_suggest(keyword):
    job = q.enqueue(find_keyword, keyword)
    while not job:
        time.sleep(1)
    return jsonify(word=job)

我正在使用 flask-cache 尝试将结果保存为计算,最多只需要 运行 每周一次,一个月一次也足够了。

我遇到的问题是当这个 运行 时,它缓存了失败的响应,而不是实际的解决方案。

还有其他方法吗?或者我应该如何处理这个问题的建议?

您正在尝试 JSON 编码 Job 代理对象,而不是作业的结果。您确实想在此处查看作业结果

job = q.enqueue(find_keyword, keyword)
while not job.result:
    time.sleep(1)
return jsonify(word=job.result)

这应该很好缓存。

您可以使用 Cache.memoize() decorator:

记住 find_keyword 函数的结果
@cache.memoize(30 * 24 * 60 * 60)
def find_keyword(keyword):
    # ....

这将缓存 find_keyword() 函数的结果一个月,完全基于 keyword 参数(不同关键字的结果独立缓存)。

还有一点要注意:在将额外的装饰器应用到视图函数时,请确保将 @app.route() 装饰器 放在顶部 (最后应用)。应用的任何装饰器 'later' 都将被忽略,因为它不是它们的输出被注册为视图:

@app.route('/as/<keyword>', methods=['GET'])
@cache.cached(timeout=2592000)
@db_session
def auto_suggest(keyword):
    job = q.enqueue(find_keyword, keyword)
    while not job.result:
        time.sleep(1)
    return jsonify(word=job.result)