如何使用Flask cache和Redis缓存SQL炼金术调用?

2024-05-11 20:55:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Flask应用程序,它从web表单获取参数,使用SQL Alchemy查询数据库,并返回Jinja生成的HTML,显示一个包含结果的表。我想缓存对数据库的调用。我查看了Redis(Using redis as an LRU cache for postgres),它引导我找到了http://pythonhosted.org/Flask-Cache/

现在我尝试使用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)

我有两个问题:

  1. 我该为argskwargs放些什么?这是什么意思?如何使用烧瓶缓存设置Redis缓存?

  2. 一旦设置了缓存,我似乎希望以某种方式“memoize”调用数据库,以便如果该方法获得相同的查询,它将缓存输出。我该怎么做?我最好的猜测是将调用SQL Alchemy包装在一个方法中,然后可以给memoize decorator?这样,如果将两个相同的查询传递给该方法,Flask缓存将识别此查询并返回相应的响应。我猜应该是这样的:

    @cache.memoize(timeout=50)
    def queryDB(q):
        return q.all()
    

这似乎是Redis+Flask+Flask Cache+SQL炼金术的一个相当常见的用法,但是我无法找到一个完整的示例来遵循。如果有人能发布一个,那将是非常有帮助的——但对我和其他人来说。


Tags: 方法redisconfig数据库appflaskcachefor
1条回答
网友
1楼 · 发布于 2024-05-11 20:55:37

您不需要创建自定义的RedisCache类。文档只是教您如何创建在flask-cache中不可用的新后端。但是RedisCache已经在werkzeug >= 0.7中可用,您可能已经安装了它,因为它是烧瓶的核心依赖项之一。

这就是我如何使用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 is not a valid FlaskCache backend"的原因可能是您没有安装redis(python库),您可以通过以下方式安装:
pip install redis

网友
2楼 · 发布于 2024-05-11 20:55:37

你的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放在从数据库获取信息的方法上应该可以工作。

相关问题 更多 >