python - ¿Cómo almacenar en caché llamadas de alquimia sql con Flask-cache y redis?
sqlalchemy (2)
No es necesario crear una clase personalizada de RedisCache
. Los documentos solo enseñan cómo crearía nuevos backends que no están disponibles en flask-cache
. Pero RedisCache
ya está disponible en werkzeug >= 0.7
, que es posible que ya haya instalado porque es una de las dependencias principales del matraz.
Así es como podría ejecutar el flask-cache con redis backend:
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)
La razón por la que está obteniendo "ImportError: redis is not a valid FlaskCache backend"
es probablemente porque no tiene redis
(biblioteca de Python) instalado, que puede instalar simplemente:
pip install redis
.
Tengo una aplicación de matraz que toma parámetros de un formulario web, consulta una base de datos con alquimia SQL y devuelve una plantilla generada por jinja que muestra una tabla con los resultados. Quiero cachear las llamadas a la base de datos. Busqué en redis, usando redis como un caché LRU para postgres , lo que me llevó a http://pythonhosted.org/Flask-Cache/
Ahora estoy tratando de usar redis + flask-cache para almacenar en caché las llamadas a la base de datos. Según los documentos de Flask-Cache, parece que necesito configurar un caché de redis personalizado.
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)
A partir de ahí necesitaría algo como
cache = redis(app, config={''CACHE_TYPE'': ''redis''}) //not sure what to put for args or kwards?
app = Flask(__name__)
cache.init_app(app)
Tengo dos preguntas:
Primero: ¿qué pongo para args y kwargs? ¿Qué significan estos? ¿Cómo configuro un caché de redis con el caché de matraz?
Segundo: una vez que se configura el caché, parece que de alguna manera me gustaría " memoize " las llamadas al DB para que si el método recibe la misma consulta tiene el resultado guardado en la memoria caché. ¿Cómo hago esto? Mi mejor suposición sería envolver la llamada alquimia de SQL en un método que luego se le podría dar decorador memoize? De esa manera, si se pasaban dos consultas idénticas al método, flask-cache reconocería esto y volvería a la respuesta apropiada. Supongo que se vería así:
@cache.memoize(timeout=50)
def queryDB(q):
return q.all()
Esto parece ser un uso bastante común de la alquimia redis + flask + flask-cache + sql pero no puedo encontrar un ejemplo completo a seguir. Si alguien pudiera publicar uno, sería muy útil, pero para mí y para otros en el futuro.
tus redis args se verían así:
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''
})
Poner el @ cache.memoize sobre un método que toma la información de la base de datos debería funcionar.