Как кэшировать вызовы sql alchemy с помощью Flask-cache и redis?
у меня есть приложение колбы, которое принимает параметры из веб-формы, запрашивает DB w/ SQL alchemy и возвращает шаблон jinja, показывающий таблицу с результатами. Я хочу кэшировать вызовы в DB. Я заглянул в редис,использование redis в качестве кэша LRU для 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)
оттуда мне нужно было бы что-то вроде
cache = redis(app, config={'CACHE_TYPE': 'redis'}) //not sure what to put for args or kwards?
app = Flask(__name__)
cache.init_app(app)
у меня два вопроса:
во-первых: что я ставлю для args и kwargs? Что это значит? Как настроить кэш redis с помощью кэша колб?
второй: как только кэш настроен, кажется, что я хотел бы как-то "memoize " вызывает БД, так что если метод получает тот же запрос, он кэширует выходные данные. Как мне быть? это? Мое лучшее предположение было бы обернуть вызов SQL alchemy в метод, который затем можно было бы дать memoize decorator? Таким образом, если два идентичных запроса были переданы методу, flask-cache распознает это и вернется к соответствующему ответу. Я предполагаю, что это будет выглядеть так:
@cache.memoize(timeout=50)
def queryDB(q):
return q.all()
Это похоже на довольно распространенное использование redis + flask + flask-cache + sql alchemy, но я не могу найти полный пример для подражания. Если бы кто-то мог опубликовать его, это было бы очень полезно - но для меня и для других в будущем.
2 ответов
вам не нужно создавать пользовательские RedisCache
класса. Документы просто учат, как создавать новые бэкэнды, которые недоступны в flask-cache
. Но!--1--> уже доступен в werkzeug >= 0.7
, который вы, возможно, уже установили, потому что это одна из основных зависимостей flask.
вот как я мог бы запустить фляжку-кэш с бэкэндом redis:
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 is not a valid FlaskCache backend"
вероятно, потому, что у вас нет redis
(библиотека python) установлен, который вы можете просто установить на:pip install redis
.
ваши 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 над методом, который захватывает информацию из БД, должен работать.