Как мне работать с кэшированными значениями, созданными при помощи 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
!
используется для различения целых и других типов значений.