我有一个Flask应用程序,它从Web表单获取参数,使用SQL Alchemy查询数据库并返回Jinja生成的HTML,显示包含结果的表。我想缓存对DB的调用。我查看了Redis(Using redis as an LRU cache for postgres),这导致我http://pythonhosted.org/Flask-Cache/。
现在我正在尝试使用Redis + Flask-Cache来缓存对数据库的调用。基于Flask-Cache文档,我似乎需要设置自定义Redis缓存。
class RedisCache(BaseCache):
def __init__(self, servers, default_timeout=500):
pass
def redis(app, config, args, kwargs):
args.append(app.config['REDIS_SERVERS'])
return RedisCache(*args, **kwargs)
从那里我需要像:
# not sure what to put for args or kwargs
cache = redis(app, config={'CACHE_TYPE': 'redis'})
app = Flask(__name__)
cache.init_app(app)
我有两个问题:
我应该为args
和kwargs
投放什么?这些是什么意思?如何使用Flask-Cache设置Redis缓存?
一旦设置了缓存,似乎我想以某种方式“memoize”调用数据库,这样如果方法得到相同的查询,它就会缓存输出。我该怎么做呢?我最好的猜测是将SQL Alchemy的调用包装在一个方法中,然后可以给memoize装饰器?这样,如果将两个相同的查询传递给该方法,Flask-Cache将识别这一点并返回相应的响应。我猜它会是这样的:
@cache.memoize(timeout=50)
def queryDB(q):
return q.all()
这似乎是Redis + Flask + Flask-Cache + SQL Alchemy的相当常见的用途,但我无法找到完整的示例。如果有人可以发布一个,这将是非常有用的 - 但对我和其他人来说。
答案 0 :(得分:35)
您不需要创建自定义RedisCache
课程。文档只是教你如何创建flask-cache
中没有的新后端。但是RedisCache
已经可以使用werkzeug >= 0.7
,您可能已经安装了import time
from flask import Flask
from flask_cache import Cache
app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'redis'})
@cache.memoize(timeout=60)
def query_db():
time.sleep(5)
return "Results from DB"
@app.route('/')
def index():
return query_db()
app.run(debug=True)
,因为它是烧瓶的核心依赖项之一。
这就是我用redis后端运行flask-cache的方法:
"ImportError: redis is not a valid FlaskCache backend"
您获得redis
的原因可能是因为您没有安装pip install redis
(python库),您可以通过以下方式安装:
{{1}}。
答案 1 :(得分:12)
你的redis args看起来像这样:
cache = Cache(app, config={
'CACHE_TYPE': 'redis',
'CACHE_KEY_PREFIX': 'fcache',
'CACHE_REDIS_HOST': 'localhost',
'CACHE_REDIS_PORT': '6379',
'CACHE_REDIS_URL': 'redis://localhost:6379'
})
将@ cache.memoize放在一个抓取数据库信息的方法上应该有效。