2014-07-05 22 views
16

Bir web formundan parametreler alan, DB w/SQL simyası sorgulayan ve sonuçları içeren bir tabloyu gösteren jinja tarafından oluşturulan bir şablon döndüren bir flask uygulamasına sahibim. DB'ye yapılan çağrıları önbelleğe almak istiyorum. Using redis as an LRU cache for postgres redis'e baktım - bu da beni http://pythonhosted.org/Flask-Cache/sql simya çağrıları Flask-önbellek ve redis ile nasıl önbelleğe alınır?

'a yönlendirdi. Şimdi DB'ye yapılan çağrıları önbelleğe almak için redis + flask-cache kullanıyorum. Flask-Cache belgelerine dayanarak, özel bir redis önbelleği ayarlamam gerekiyor gibi görünüyor. İlk

: Ben args ve kwargs ne için koyacağım

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) 

Oradan iki soru var

cache = redis(app, config={'CACHE_TYPE': 'redis'}) //not sure what to put for args or kwards? 

app = Flask(__name__) 
cache.init_app(app) 

gibi bir şey gerekir? Bunlar ne anlama geliyor? Flask önbelleği ile bir redis önbelleği nasıl kurarım?

İkincisi: Önbellek ayarlandığında, bir şekilde "memoize" ifadesini kullanmak istiyorum gibi görünüyor; böylece, yöntem aynı sorguyu aldığında çıktı önbelleğe alınmış olur. Bunu nasıl yaparım? En iyi tahminim, SQL simyasını, daha sonra memoize dekoratör olarak verilebilecek bir yöntemle sarmak olurdu. Bu şekilde, yönteme iki özdeş sorgu aktarılmışsa, flask-önbellek bunu algılar ve uygun yanıtı döndürür. Ben şuna benzer olduğunu tahmin ediyorum:

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

Bu REDIS + şişeye + şişe-cache + sql simya oldukça yaygın kullanım gibi görünüyor ama takip etmek ve eksiksiz bir örnek bulamıyorum. Birisi bir mesaj gönderebilseydi, bu çok yararlı olurdu - ama benim için ve diğerleri için de.

+0

Sorgu nesnesini argüman olarak iletmenin, nesnenin bellek adresini kullanarak not almasını sağlayan problemle karşılaştım. Bir sarma sınıfı bunu çözdü. Bu birisine yardımcı olabilir umarım .. – ezdazuzena

cevap

28

Özel RedisCache sınıfı oluşturmanız gerekmez. Dokümanlar, yalnızca flask-cache'da bulunmayan yeni arka planlar oluşturmayı öğretiyor. Ancak, RedisCache zaten zaten yüklü olabilir, zaten şişenin temel bağımlılıklarından biri olduğundan, werkzeug >= 0.7 içinde kullanılabilir.

Bu

Ben Redis arka ucuyla şişesi-cache çalıştırabilir nasıl: yüklü Eğer redis (piton kütüphanesi) yok çünkü

import time 
from flask import Flask 
from flask.ext.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) 

Eğer "ImportError: redis is not a valid FlaskCache backend" alıyoruz nedeni muhtemelen hangi basitçe can tarafından yükleyin:
pip install redis.

+0

'pip install redis'i benim durumumda :) Cevabında açıklanan Riz gibi redis bağlantılarını yapılandırmanız gerektiğini unutmayın. –

+4

Not: flask flaskt.ext.cache import Cache 'kullanılarak flask uzantısının içe aktarılması kullanımdan kaldırıldı:' flask_cache import Cache' yerine. –

11

sizin Redis args şuna benzer olacaktır:

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' 
    }) 

çalışmalıdır DB'den bilgi çekecek bir yöntem üzerinde @ cache.memoize koymak.

+0

Bu örneği takip edersem "ImportError: redis geçerli bir FlaskCache arka ucu değil" olur – bernie2436

+0

CACHE_TYPE 'redis' olarak değiştirirseniz ERROR alırım: flask_cache: Özel durum önbellek arka uç nedeniyle olabilir. ..AttributeError: 'Flask' nesnesinin 'mget' özelliği yoktur – bernie2436

+2

Redid python kütüphanesinin kurulu olduğundan emin olun. pip install redis – Riz

İlgili konular