2013-04-21 133 views
4

我有一个管理操作,它将当前选择和一个处理程序类(object的子类)存储到会话中,并重定向到处理选择的另一个页面。但是,由于某种原因,每当我这样做时,整个会话都会丢失。Django会话意外丢失数据

实际情况是,在调用视图函数时会出现错误,表明会话没有键'action_options'。深入研究实际发生的事情,变量会在会话中设置好,但在调用视图时,会话是完全空的,包括之前肯定存在的管理员登录。所有其他页面(即内置管理页面)加载正常。

这里的行动:

def myaction(self, request, queryset): 
    opts = request.session.setdefault('action_options', {}) 
    opts['queryset'] = queryset 
    opts['handler'] = MyHandlerClass 
    request.session.modified = True 
    return HttpResponseRedirect(reverse('myapp.views.handler_view')) 

而这里的观点,目前刚刚打印出的选项设置:

def handler_view(request): 
    opts = request.session['action_options'] 
    return HttpResponse(str(opts)) 

我也曾尝试直接存储查询集,即request.session['queryset'] = queryset,但我得到相同的行为。但是,如果我保存主键列表,那很好。

供参考,这是我的中间件的定义:

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 

    'johnny.middleware.LocalStoreClearMiddleware', 
    'johnny.middleware.QueryCacheMiddleware', 
) 

我使用约翰尼缓存,具有以下配置:

CACHES = { 
    'default' : dict(
     BACKEND='johnny.backends.memcached.MemcachedCache', 
     LOCATION=['127.0.0.1:11211'], 
     JOHNNY_CACHE=True, 
    ) 
} 
JOHNNY_MIDDLEWARE_KEY_PREFIX = 'jc_myproj' 

回答

0

查询集,在执行之前,不能被序列化和存储在会议中。

opts['queryset'] = list(queryset) 

这将使它成为一个列表,但问题仍然是它是否可以序列化和反序列化。基本上,会话数据是纯文本。计划相应。