繁体   English   中英

如何使用Flask-Cache和Redis缓存SQL Alchemy调用?

[英]How to cache SQL Alchemy calls with Flask-Cache and Redis?

我有一个Flask应用程序,它从Web表单获取参数,使用SQL Alchemy查询数据库并返回Jinja生成的HTML,显示包含结果的表。 我想缓存对DB的调用。 我查看了Redis( 使用redis作为postgres的LRU缓存 ),这使我进入了http://pythonhosted.org/Flask-Cache/

现在我尝试使用Redis + Flask-Cache来缓存对DB的调用。 基于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)

从那里我需要像:

# 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什么? 这些是什么意思? 如何使用Flask-Cache设置Redis缓存?

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

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

这似乎是Redis + Flask + Flask-Cache + SQL Alchemy的一个相当常见的用法,但我无法找到一个完整的例子。 如果有人可以发布一个,这将是非常有用的 - 但对我和其他人来说。

您不需要创建自定义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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM