烧瓶缓存没有缓存

问题描述:

我跟着烧瓶缓存的tutorial,并试图自己实现它。 给出以下示例,为什么Flask不缓存时间?烧瓶缓存没有缓存

from flask import Flask 
import time 

app = Flask(__name__) 
cache = Cache(config={'CACHE_TYPE': 'simple'}) 
cache.init_app(app) 

@app.route('/time') 
@cache.cached(timeout=50, key_prefix='test') 
def test(): 
    return time.ctime() 

输出总是当前时间。

看来每个请求都会重新创建缓存。我究竟做错了什么?

编辑:我使用Python 2.7.6执行下面的Python文件:

def runserver(): 
    port = int(os.environ.get('PORT', 5000)) 
    Triangle(app) 
    app.run(host='0.0.0.0', port=port, processes=5) 


if __name__ == '__main__': 
    runserver() 
+0

我无法重现此;当使用捆绑的'app.run()'开发服务器与Flask一起运行时,时间被缓存。你如何运行? –

+0

请注意,'SimpleCache'是一个*全局字典*。如果您使用的是使用多处理扩展的WSGI服务器,您将获得单独的副本,并且它们不会缓存。 –

+0

感谢Martijn,我在本地运行它,而不是将它部署到任何wsgi服务器。我添加了脚本 – Frame91

您正在使用SimpleCache设置:

cache = Cache(config={'CACHE_TYPE': 'simple'}) 

它使用一个单一的全球字典来保存高速缓存,而这只有在您使用一个使用一个Python解释器来服务所有WSGI请求的WSGI服务器时才会起作用。如果您使用使用独立子进程处理请求的WSGI服务器,则每次都会收到该字典的新副本,并且没有任何内容可以有效缓存。

由于您不使用processes参数,因此与内置app.run()开发服务器一起运行时,该代码可以正常工作。

您的更新显示您使用单独的进程运行服务器。每个进程都将获得自己的字典,并且缓存不在它们之间共享。改为使用不同的缓存后端,如filesystem

cache = Cache(config={'CACHE_TYPE': 'filesystem', 'CACHE_DIR': '/tmp'}) 
+0

你是对的!如果我想保留流程参数,我需要做些什么改变? – Frame91

+0

使用不同的后端,可以在进程之间共享的后端。 'filesystem'是一个不需要额外的依赖关系的文件系统。 –

+1

非常感谢你的完美答案!我不会自己想出来的! – Frame91