【发布时间】:2014-08-26 16:02:15
【问题描述】:
我有一个 Flask 应用程序,它从 Web 表单中获取参数,使用 SQL Alchemy 查询数据库并返回 Jinja 生成的 HTML,显示一个带有结果的表格。我想缓存对数据库的调用。我查看了 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 的一个相当普遍的用法,但我无法找到一个完整的示例来遵循。如果有人可以发布一个,那将非常有帮助 - 但对我和其他人来说。
【问题讨论】:
-
我遇到的问题是,将查询对象作为参数传递会使用对象的内存地址产生 memoize。一个包装类解决了这个问题。希望这可能对某人有所帮助..
标签: python flask redis sqlalchemy flask-cache