2013-04-21 119 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) 

這將使它成爲一個列表,但問題仍然是它是否可以序列化和反序列化。基本上,會話數據是純文本。計劃相應。