Как мне работать с кэшированными значениями, созданными при помощи flash-кеша

Я использую флеш-кеш в приложении и пытаюсь предварительно заполнить кеш отдельным процессом. Проблема в том, что я не могу понять, в каком формате хранятся кэшированные значения.

Глядя на кэшированные значения, они выглядят так, как будто они были выбраны, но значения, созданные кэшированными функциями, немного отличаются от обычных значений и не могут быть выбраны напрямую. Вот пример:

Вот мой вид колбы:

@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: неверный ключ загрузки, '!'."

Поскольку я не до конца понимаю проблему, мне неудобно реализовывать решение (например, удаляя / добавляя '!' Для всех строк байтов). Я на правильном пути здесь?

1 ответ

Решение

Согласно 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

! используется для различения целых и других типов значений.

Другие вопросы по тегам