如何用Flask-cache和redis缓存sql炼金术调用?

ber*_*436 22 python sqlalchemy redis flask flask-cache

我有一个烧瓶应用程序,它从Web表单中获取参数,查询DB w/SQL炼金术并返回一个jinja生成的模板,显示包含结果的表.我想缓存对DB的调用.我查看了redis,使用redis作为postgres的LRU缓存 - 这引导我到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)
Run Code Online (Sandbox Code Playgroud)

从那里我需要类似的东西

# not sure what to put for args or kwargs
cache = redis(app, config={'CACHE_TYPE': 'redis'})

app = Flask(__name__)
cache.init_app(app)
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

首先:我为args和kwargs做什么?这些是什么意思?如何使用flask缓存设置redis缓存?

第二:一旦设置了缓存,似乎我想以某种方式" 记住 "DB的调用,这样如果方法得到相同的查询,它就会缓存输出.我该怎么做呢?我最好的猜测是将SQL炼金术的调用包装在一个方法中,然后可以给memoize装饰器?这样,如果将两个相同的查询传递给方法,flask-cache将识别出这一点并返回相应的响应.我猜它会是这样的:

@cache.memoize(timeout=50)
def queryDB(q):
    return q.all()
Run Code Online (Sandbox Code Playgroud)

这似乎是一个相当普遍的使用redis + flask + flask-cache + sql炼金术,但我无法找到一个完整的例子.如果有人可以发布一个,这将是非常有用的 - 但对我和其他人来说.

suz*_*kya 38

您不需要创建自定义RedisCache类.文档只是教你如何创建不可用的新后端flask-cache.但是RedisCache已经可以使用werkzeug >= 0.7,因为它是flask的核心依赖项之一.

这是我用redis后端运行flask-cache的方法:

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)
Run Code Online (Sandbox Code Playgroud)

你得到的原因"ImportError: redis is not a valid FlaskCache backend"可能是因为你没有安装redis(python库),你可以简单地安装:
pip install redis.

  • 注意:使用`from flask flaskt.ext.cache import Cache`导入flask扩展名已被弃用:使用:from来自flask_cache import Cache`. (4认同)

Riz*_*Riz 13

你的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'
    })
Run Code Online (Sandbox Code Playgroud)

将@ cache.memoize放在从数据库中获取信息的方法上应该可以正常工作.

  • 确保安装了redid python库.pip install redis (3认同)