2015-08-19 78 views
1

我在應用中使用flask-cache並試圖在單獨的進程中預填充緩存。問題是我無法弄清緩存值的格式。如何使用由flask-cache創建的緩存值使用

看着緩存的值,他們看起來像被醃了,但緩存函數創建的值與正常的pickle值稍有不同並且不能直接取出。這裏有一個例子:

這裏是我的燒瓶觀點:

@app.route('/index') 
@cache.cached(timeout=60) 
def index(): 
    return 'foo' 

這裏是我的觀點的緩存值,存儲在Redis的:

>>> r = redis.StrictRedis() 
>>> r.keys() 
[b'flask_cache_view//index'] 
>>> r.get('flask_cache_view//index') 
b'!\x80\x03X\x03\x00\x00\x00fooq\x00.' 

通知緩存的字節串擁有國內領先的「! 」。比較人工酸洗「富」:

>>> import pickle 
>>> pickle.dumps('foo') 
b'\x80\x03X\x03\x00\x00\x00fooq\x00.' 

後者可以拆封,而是試圖在unpickle錯誤燒瓶緩存值結果「_pickle.UnpicklingError:‘!’無效負載的關鍵。」

因爲我不完全理解這個問題,所以我不習慣實現一個解決方案(例如,在所有字節串中刪除/預先加上'!')。我在正確的軌道上嗎?

回答

1

按照werkzeug.contrib.cache.RedisCachecode

def dump_object(self, value): 
    """Dumps an object into a string for redis. By default it serializes 
    integers as regular string and pickle dumps everything else. 
    """ 
    t = type(value) 
    if t in integer_types: 
     return str(value).encode('ascii') 
    return b'!' + pickle.dumps(value) 

def load_object(self, value): 
    """The reversal of :meth:`dump_object`. This might be called with 
    None. 
    """ 
    if value is None: 
     return None 
    if value.startswith(b'!'): 
     try: 
      return pickle.loads(value[1:]) 
     except pickle.PickleError: 
      return None 
    try: 
     return int(value) 
    except ValueError: 
     # before 0.8 we did not have serialization. Still support that. 
     return value 

!用於區分整數和其他類型的值。

+0

這正是我所期待的。謝謝! – daveruinseverything

相關問題