簡體   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