我在应用程序中使用烧瓶缓存,并试图在一个单独的进程中预先填充缓存。问题是我无法确定缓存的值存储在哪种格式中。
从缓存的值来看,它们看起来像是被腌制过的,但是由缓存函数创建的值与普通的腌制值略有不同,不能直接对其进行清拣。下面是一个例子:
这是我的酒瓶视图:
@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.'注意缓存的字节串有一个前导'!‘。与手工腌制‘foo’相比:
>>> import pickle
>>> pickle.dumps('foo')
b'\x80\x03X\x03\x00\x00\x00fooq\x00.'可以不对后者进行腌制,但是尝试打开烧瓶缓存值会导致一个错误"_pickle.UnpicklingError:无效加载键,‘!’“。
因为我不完全理解这个问题,所以我不习惯实现一个解决方案(例如删除/预置'!‘!在所有的字节串上)。我在这里走得对吗?
发布于 2015-08-19 12:06:35
根据werkzeug.contrib.cache.RedisCache 代码
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!用于区分整数和其他类型的值。
https://stackoverflow.com/questions/32094249
复制相似问题