|
|
|
|
@ -5,28 +5,83 @@ 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)
|
|
|
|
|
|
|
|
|
|
|