首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理由烧瓶缓存创建的缓存值?

问如何处理由烧瓶缓存创建的缓存值?
EN

Stack Overflow用户
提问于 2015-08-19 11:29:56
回答 1查看 1.3K关注 0票数 3

我在应用程序中使用烧瓶缓存,并试图在一个单独的进程中预先填充缓存。问题是我无法确定缓存的值存储在哪种格式中。

从缓存的值来看,它们看起来像是被腌制过的,但是由缓存函数创建的值与普通的腌制值略有不同,不能直接对其进行清拣。下面是一个例子:

这是我的酒瓶视图:

代码语言:javascript
复制
@app.route('/index')
@cache.cached(timeout=60)
def index():
    return 'foo'

以下是存储在redis中的从我的视图中缓存的值:

代码语言:javascript
复制
>>> 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’相比:

代码语言:javascript
复制
>>> import pickle
>>> pickle.dumps('foo')
b'\x80\x03X\x03\x00\x00\x00fooq\x00.'

可以不对后者进行腌制,但是尝试打开烧瓶缓存值会导致一个错误"_pickle.UnpicklingError:无效加载键,‘!’“。

因为我不完全理解这个问题,所以我不习惯实现一个解决方案(例如删除/预置'!‘!在所有的字节串上)。我在这里走得对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-19 12:06:35

根据werkzeug.contrib.cache.RedisCache 代码

代码语言:javascript
复制
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

!用于区分整数和其他类型的值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32094249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档