Как кэшировать вызовы 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 над методом, который захватывает информацию из БД, должен работать.