Django 会话意外丢失数据

Posted

技术标签:

【中文标题】Django 会话意外丢失数据【英文标题】:Django session unexpectedly loses data 【发布时间】:2013-04-14 11:46:50 【问题描述】:

我有一个管理操作,它将当前选择和一个处理程序类(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'

【问题讨论】:

【参考方案1】:

Queryset,在执行之前,不能被序列化并存储在会话中。

opts['queryset'] = list(queryset)

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

【讨论】:

以上是关于Django 会话意外丢失数据的主要内容,如果未能解决你的问题,请参考以下文章

Django 会话导致 Angular 出现 JWT“令牌丢失或不正确”错误

使用 django python-social-auth 重定向后会话值丢失

服务器数据恢复服务器意外断电导致raid信息丢失,raid崩溃的数据恢复案例

php会话数据有时会丢失

服务器数据恢复HP EVA服务器存储意外断电导致RAID信息丢失的数据恢复案例

重定向到条带后丢失会话数据