Flask-Cache と Redis を使用して SQL Alchemy 呼び出しをキャッシュする方法は? 質問する

Flask-Cache と Redis を使用して SQL Alchemy 呼び出しをキャッシュする方法は? 質問する

私はWebフォームからパラメータを取得し、SQL AlchemyでDBにクエリを実行し、結果のテーブルを表示するJinja生成HTMLを返すFlaskアプリを持っています。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)

質問が2つあります。

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

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

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

これは、Redis + Flask + Flask-Cache + SQL Alchemy のかなり一般的な使用法のように思えますが、従うべき完全な例を見つけることができません。誰かが投稿してくれたら、私にとっても、将来他の人にとっても非常に役立つでしょう。

ベストアンサー1

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

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

おそらく、(Python ライブラリ) がインストールされて"ImportError: redis is not a valid FlaskCache backend"いないため、このエラーが発生します。これは、次のように簡単にインストールできます。redis
pip install redis

おすすめ記事