我有一个管理操作,它将当前选择和处理程序类(object
的子类)存储到会话中,并重定向到另一个处理选择的页面。但是,出于某种原因,每当我这样做时,整个会话都会丢失。
实际发生的是我在调用视图函数时遇到错误,该会话没有键'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',
)
我正在使用Johnny Cache,具有以下配置:
CACHES = {
'default' : dict(
BACKEND='johnny.backends.memcached.MemcachedCache',
LOCATION=['127.0.0.1:11211'],
JOHNNY_CACHE=True,
)
}
JOHNNY_MIDDLEWARE_KEY_PREFIX = 'jc_myproj'
答案 0 :(得分:0)
Queryset在执行之前无法序列化并存储在会话中。
opts['queryset'] = list(queryset)
这会使它成为一个列表,但问题仍然是它是否可以序列化和反序列化。基本上,会话数据是纯文本。相应地计划。