Flask缓存未缓存

12

我跟着Flask-Cache教程试着自己实现了一下。 根据以下的例子,为什么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()

我无法重现这个问题;当使用Flask捆绑的app.run()开发服务器运行时,时间会被缓存。你是怎么运行的? - Martijn Pieters
请注意,SimpleCache 是一个全局字典。如果您正在使用使用多进程进行扩展的WSGI服务器,将会得到单独的副本,并且它们似乎不会被缓存。 - Martijn Pieters
谢谢Martijn,我正在本地运行它,而不是部署到任何wsgi服务器上。我添加了我的运行脚本。 - Frame91
1个回答

24

您正在使用SimpleCache设置:

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

这里使用单一的全局字典来保存缓存,而且只有当您使用一个WSGI服务器来服务于所有的WSGI请求时,它才能正常工作(这个WSGI服务器需要使用同一个Python解释器)。如果您使用的WSGI服务器使用不同的子进程来处理请求,每次您都会得到该字典的一个新副本,这样缓存就无效了。

当您使用内置的app.run()开发服务器运行代码时,只要不使用processes参数,它就可以正常工作。

您的更新显示您使用了5个独立的进程来运行服务器。每个进程都会获得自己的字典,缓存在它们之间不共享。请使用其他的缓存后端,例如filesystem

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

你是对的!如果我想保留processes参数,我需要改变什么? - Frame91
使用一个可以在不同进程之间共享的不同后端。 filesystem 是一个不需要额外依赖项的后端之一。 - Martijn Pieters
1
非常感谢您的完美答案!我自己想不出来! - Frame91
如果我从.ini文件中告诉WSGI进程,那么app.run(host='0.0.0.0', port=port, processes=5)会改变情况吗?cache_dir是否可见? - Beqa Bukhradze
1
@BeqaBukhradze:使用uWSGI时,那部分不会运行。在这种情况下,if __name__ == '__main__'测试不成立。app.run()运行Flask内置的WSGI服务器,而不是uWSGI。 - Martijn Pieters
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接