在 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)
我有一个很长的任务进入 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)