|
|
|
|
@ -5,28 +5,66 @@ from djangoblog.utils import cache
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MemcacheStorage(SessionStorage):
|
|
|
|
|
"""
|
|
|
|
|
基于Memcache的微信WeRoBot会话存储实现,用于在微信机器人开发中持久 持久化存储用户会话数据(如对话状态、临时信息等)
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
def __init__(self, prefix='ws_'):
|
|
|
|
|
self.prefix = prefix
|
|
|
|
|
self.cache = cache
|
|
|
|
|
"""
|
|
|
|
|
初始化会话存储
|
|
|
|
|
:param prefix: 缓存键的前缀,用于区分不同类型的缓存数据,默认'ws_'(WeChat Session缩写)
|
|
|
|
|
"""
|
|
|
|
|
self.prefix = prefix # 缓存键前缀
|
|
|
|
|
self.cache = cache # 引入Django项目中的缓存实例(通常配置为Memcache)
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def is_available(self):
|
|
|
|
|
value = "1"
|
|
|
|
|
self.set('checkavaliable', value=value)
|
|
|
|
|
return value == self.get('checkavaliable')
|
|
|
|
|
"""
|
|
|
|
|
检查缓存存储是否可用
|
|
|
|
|
:return: 布尔值,True表示可用,False表示不可用
|
|
|
|
|
"""
|
|
|
|
|
test_value = "1"
|
|
|
|
|
# 尝试写入测试数据
|
|
|
|
|
self.set('check_available', value=test_value)
|
|
|
|
|
# 读取测试数据并对比,验证缓存读写功能是否正常
|
|
|
|
|
return test_value == self.get('check_available')
|
|
|
|
|
|
|
|
|
|
def key_name(self, s):
|
|
|
|
|
return '{prefix}{s}'.format(prefix=self.prefix, s=s)
|
|
|
|
|
"""
|
|
|
|
|
生成带前缀的缓存键名,避免不同类型数据的键冲突
|
|
|
|
|
:param s: 原始键名(如用户ID)
|
|
|
|
|
:return: 带前缀的完整键名(如'ws_user123')
|
|
|
|
|
"""
|
|
|
|
|
return f'{self.prefix}{s}'
|
|
|
|
|
|
|
|
|
|
def get(self, id):
|
|
|
|
|
id = self.key_name(id)
|
|
|
|
|
session_json = self.cache.get(id) or '{}'
|
|
|
|
|
"""
|
|
|
|
|
从缓存中获取会话数据
|
|
|
|
|
:param id: 会话ID(通常为用户标识,如OpenID)
|
|
|
|
|
:return: 反序列化后的会话数据字典
|
|
|
|
|
"""
|
|
|
|
|
# 生成带前缀的键名
|
|
|
|
|
cache_key = self.key_name(id)
|
|
|
|
|
# 从缓存读取数据,默认返回空JSON字符串'{}'
|
|
|
|
|
session_json = self.cache.get(cache_key) or '{}'
|
|
|
|
|
# 将JSON字符串反序列化为Python字典
|
|
|
|
|
return json_loads(session_json)
|
|
|
|
|
|
|
|
|
|
def set(self, id, value):
|
|
|
|
|
id = self.key_name(id)
|
|
|
|
|
self.cache.set(id, json_dumps(value))
|
|
|
|
|
"""
|
|
|
|
|
将会话数据存入缓存
|
|
|
|
|
:param id: 会话ID
|
|
|
|
|
:param value: 要存储的会话数据(字典类型)
|
|
|
|
|
"""
|
|
|
|
|
cache_key = self.key_name(id)
|
|
|
|
|
# 将数据字典序列化为JSON字符串后存入缓存
|
|
|
|
|
self.cache.set(cache_key, json_dumps(value))
|
|
|
|
|
|
|
|
|
|
def delete(self, id):
|
|
|
|
|
id = self.key_name(id)
|
|
|
|
|
self.cache.delete(id)
|
|
|
|
|
"""
|
|
|
|
|
从缓存中删除会话数据
|
|
|
|
|
:param id: 会话ID
|
|
|
|
|
"""
|
|
|
|
|
cache_key = self.key_name(id)
|
|
|
|
|
# 删除指定键的缓存数据
|
|
|
|
|
self.cache.delete(cache_key)
|
|
|
|
|
|