Django Memcached会话存储中的会话变量前缀

时间:2015-09-17 15:10:18

标签: python django session

我们有几个服务将共享存储在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中间件正在刷新会话。我在这里不知所措。

1 个答案:

答案 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)