Python 如何使用Flask cache和Redis缓存SQL Alchemy调用?
我有一个Flask应用程序,它从web表单获取参数,使用SQL Alchemy查询数据库,并返回Jinja生成的HTML,其中显示了一个结果表。我想缓存对数据库的调用。我查看了Redis(),这让我想到了 现在我尝试使用Redis+Flask缓存来缓存对DB的调用。基于Flask缓存文档,似乎我需要设置一个自定义Redis缓存Python 如何使用Flask cache和Redis缓存SQL Alchemy调用?,python,flask,redis,sqlalchemy,flask-cache,Python,Flask,Redis,Sqlalchemy,Flask Cache,我有一个Flask应用程序,它从web表单获取参数,使用SQL Alchemy查询数据库,并返回Jinja生成的HTML,其中显示了一个结果表。我想缓存对数据库的调用。我查看了Redis(),这让我想到了 现在我尝试使用Redis+Flask缓存来缓存对DB的调用。基于Flask缓存文档,似乎我需要设置一个自定义Redis缓存 class RedisCache(BaseCache): def __init__(self, servers, default_timeout=500):
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缓存设置Redis缓存@cache.memoize(timeout=50)
def queryDB(q):
return q.all()
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'
})
这似乎是Redis+Flask+Flask Cache+SQL炼金术的一个相当常见的用法,但我找不到一个完整的例子来遵循。如果有人能发布一个,那将非常有帮助——但对我和其他人来说都是如此。您的redis args将如下所示:
@cache.memoize(timeout=50)
def queryDB(q):
return q.all()
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放在从数据库获取信息的方法上应该会起作用。您不需要创建自定义的
RedisCache
类。这些文档只是教您如何创建在flask cache
中不可用的新后端。但是,RedisCache
已经在werkzeug>=0.7
中提供,您可能已经安装了它,因为它是flask的核心依赖项之一
这就是我如何使用redis后端运行flask缓存的方法:
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)
您之所以得到“ImportError:redis不是有效的FlaskCache后端”可能是因为您没有安装可通过以下方式安装的redis
(python库):pip安装redis
如果我遵循这个示例,如果我将CACHE_类型更改为'redis',我会得到“ImportError:redis不是有效的FlaskCache后端”,我会得到错误:flask_缓存:异常可能是由于缓存后端…AttributeError:'flask'对象没有属性'mget',请确保已安装redid python库。pip安装Redis如何为生产设置Redis主机(不使用localhost作为主机)?我正试图找到一个好的在线指南来设置Redis主机,但找不到任何东西。我遇到了一个问题,将查询对象作为参数传递会产生使用对象内存地址的memoize。一个包装类解决了这个问题。希望这可能会对某人有所帮助。pip安装redis
在我的情况下:)请记住,您需要像Riz在回答中描述的那样配置redis连接。注意:从flask-flaskt.ext.cache导入缓存使用导入flask扩展已被弃用使用:从flask\u缓存导入缓存。