web-dev-qa-db-ja.com

Flask-CacheとRedisでSQL Alchemy呼び出しをキャッシュする方法は?

FlaskアプリがWebフォームからパラメーターを取得し、SQL AlchemyでDBにクエリを実行し、結果を含むテーブルを示すJinja生成HTMLを返します。DBへの呼び出しをキャッシュしたい。私はRedis( postgresのLRUキャッシュとしてredisを使用 )を調べた結果、 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)

2つの質問があります。

  1. argskwargsには何を入れますか?これらはどういう意味ですか? Flask-CacheでRedisキャッシュを設定するにはどうすればよいですか?

  2. キャッシュが設定されると、どういうわけか " memoize "がDBを呼び出し、メソッドが同じクエリを取得した場合に出力がキャッシュされるようにしたいようです。どうすればよいですか?私の推測では、SQLアルケミーの呼び出しをメソッドにラップして、メモ化デコレータを与えることができますか?このように、2つの同一のクエリがメソッドに渡された場合、Flask-Cacheはこれを認識し、適切な応答に戻ります。次のようになると思います。

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

これは、Redis + Flask + Flask-Cache + SQL Alchemyのかなり一般的な使用法のようですが、私が従うべき完全な例を見つけることはできません。誰かが投稿できる場合、それはスーパーでしょう参考になりましたが、私にとっても、他の人にとっても。

24
bernie2436

カスタムRedisCacheクラスを作成する必要はありません。ドキュメントは、flask-cacheでは利用できない新しいバックエンドを作成する方法を教えているだけです。ただし、RedisCachewerkzeug >= 0.7ですでに利用可能です。これは、フラスコのコア依存関係の1つであるため、すでにインストールされている可能性があります。

これは、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

42
suzanshakya

redis引数は次のようになります。

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を、DBから情報を取得するメソッドの上に置くと動作するはずです。

14
Riz