【问题标题】:Flask Cache not caching烧瓶缓存不缓存
【发布时间】:2016-01-03 16:52:38
【问题描述】:

我关注了 Flask-Cache 的 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()

【问题讨论】:

  • 我无法重现这个;使用捆绑的app.run() 开发服务器运行 Flask 时,时间被缓存。你是怎么运行这个的?
  • 请注意,SimpleCache 是一个全局字典。如果您使用的是使用多处理来横向扩展的 WSGI 服务器,您将获得单独的副本,并且它们似乎不会缓存。
  • 感谢 Martijn,我在本地运行它,而不是将它部署到任何 wsgi 服务器。我添加了我的运行脚本

标签: python caching flask flask-cache


【解决方案1】:

您正在使用SimpleCache 设置:

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

这使用单个全局字典来保存缓存,而这反过来仅在您使用一个使用一个 Python 解释器来服务所有 WSGI 请求的 WSGI 服务器时才有效。如果您使用的 WSGI 服务器使用单独的子进程来处理请求,那么您每次都会获得该字典的新副本,并且不会有效地缓存任何内容。

在使用内置 app.run() 开发服务器运行时,代码可以正常工作,前提是您不使用 processes 参数。

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

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

【讨论】:

  • 你是对的!如果我想保留 processes 参数,我必须改变什么?
  • 使用不同的后端,一个可以在进程之间共享的后端。 filesystem 不需要额外的依赖。
  • 非常感谢您的完美回答!我自己也想不通!
  • 对于 WSGI,如果我告诉 .ini 文件中的进程 app.run(host='0.0.0.0', port=port, processes=5) 会改变大小写吗? cache_dir 也是可见的??
  • @BeqaBukhradze:使用 uWSGI 时,该部分无法运行。在这种情况下,if __name__ == '__main__': 测试不正确。 app.run() 运行 Flask 内置的 WSGI 服务器,而不是 uWSGI。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2020-05-25
  • 2012-11-25
相关资源
最近更新 更多