我们有几个服务将共享存储在memcached中的会话。每个服务都有一个会话变量的前缀。在为Django应用程序实现此功能时,我创建了一个继承Cache后端会话存储的自定义会话存储。为了预先设置django和开发人员将设置的所有变量,我覆盖了get,set,del和contains的魔术方法。
from django.contrib.sessions.backends.cache import SessionStore as CacheSessionStore
from django.conf import settings
class SessionStore(CacheSessionStore):
key_prefix = settings.SESSION_PREFIX
def __setitem__(self, key, value):
new_key = self.key_prefix + key
return super(SessionStore, self).__setitem__(new_key, value)
def __getitem__(self, key):
new_key = self.key_prefix + key
return super(SessionStore, self).__getitem__(new_key)
def __contains__(self, key):
new_key = self.key_prefix + key
return super(SessionStore, self).__contains__(new_key)
def __delitem__(self, key):
new_key = self.key_prefix + key
return super(SessionStore, self).__delitem__(new_key)
结果是没有登录,我只是不断返回登录页面。在逐步调试时,我看到它正在使用我的前缀创建会话密钥并在memcachced中创建会话。初始登录变量在对用户进行身份验证后成功保存到memcached中的会话。在某个地方,它决定我是一个AnonomousUser并将我返回登录页面。它在进程中创建的会话存在于memcached中。在我返回登录屏幕后,我没有在我的cookie中看到我的sessionid。
RemoteUser中间件正在刷新会话。我在这里不知所措。
答案 0 :(得分:0)
看起来我也需要覆盖get和pop方法。
def get(self, key, default=None):
new_key = self.key_prefix + key
return super(SessionStore, self).get(new_key, default)
def pop(self, key, *args):
new_key = self.key_prefix + key
return super(SessionStore, self).pop(new_key, *args)