from werobot.session import SessionStorage from werobot.utils import json_loads, json_dumps from djangoblog.utils import cache class MemcacheStorage(SessionStorage): """ 基于Memcache的会话存储实现类 该类继承自SessionStorage,使用memcache作为后端存储来管理会话数据 Args: prefix (str): 存储键名的前缀,默认为'ws_' """ def __init__(self, prefix='ws_'): self.prefix = prefix self.cache = cache @property def is_available(self): """ 检查存储是否可用 通过设置并获取一个测试值来验证存储服务的可用性 Returns: bool: 存储服务可用返回True,否则返回False """ value = "1" self.set('checkavaliable', value=value) return value == self.get('checkavaliable') def key_name(self, s): """ 生成带前缀的完整键名 Args: s (str): 原始键名 Returns: str: 添加前缀后的完整键名 """ return '{prefix}{s}'.format(prefix=self.prefix, s=s) def get(self, id): """ 根据ID获取会话数据 Args: id (str): 会话ID Returns: dict: 解析后的会话数据字典 """ # 构造完整的缓存键名 id = self.key_name(id) # 从缓存中获取会话数据,如果不存在则返回空JSON对象 session_json = self.cache.get(id) or '{}' # 将JSON字符串解析为Python对象并返回 return json_loads(session_json) def set(self, id, value): """ 设置会话数据 Args: id (str): 会话ID value (any): 要存储的会话数据 """ # 构造完整的缓存键名 id = self.key_name(id) # 将数据序列化为JSON字符串并存储到缓存中 self.cache.set(id, json_dumps(value)) def delete(self, id): """ 删除指定ID的会话数据 Args: id (str): 要删除的会话ID """ # 构造完整的缓存键名 id = self.key_name(id) # 从缓存中删除对应的会话数据 self.cache.delete(id)