Python 如何使用Flask cache和Redis缓存SQL Alchemy调用?

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):

我有一个Flask应用程序,它从web表单获取参数,使用SQL Alchemy查询数据库,并返回Jinja生成的HTML,其中显示了一个结果表。我想缓存对数据库的调用。我查看了Redis(),这让我想到了

现在我尝试使用Redis+Flask缓存来缓存对DB的调用。基于Flask缓存文档,似乎我需要设置一个自定义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)
从那以后,我需要做如下工作:

# 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缓存

  • 一旦设置了缓存,我似乎想以某种方式“调用数据库”,这样如果方法得到相同的查询,它就会缓存输出。我该怎么做?我最好的猜测是将SQL炼金术的调用封装在一个方法中,然后可以给它一个memoize decorator?这样,如果将两个相同的查询传递给该方法,Flask缓存将识别这一点并返回到相应的响应。我猜它会是这样的:

    @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缓存导入缓存。