2013-03-11 115 views
1

我有以下REST方法,每次單擊jQuery選項卡來存儲活動選項卡時,都會更新會話的值。Django會話值偶爾不會持久

@csrf_exempt 
def update_active_tab_request(request): 
    """ 
    Stores the active tab for a given tab item 
    """ 
    for tab, active in request.GET.iteritems(): 
     request.session[tab] = int(active) 

    return HttpResponse("OK", status=200) 

這是一個相當簡單的常規,而我遇到的問題是,它的價值並不總是存儲在會話。我查看了Web服務器日誌,並且我已經記錄了日誌語句來驗證代碼是否被調用。一切似乎都在工作,但我發現當這個方法返回時會話沒有被更新。

認爲它可能是更新會話時的性能/同步問題,我已將會話存儲更改爲SESSION_ENGINE='django.contrib.sessions.backends.cache'。這並沒有幫助。我也設置SESSION_SAVE_EVERY_REQUEST=True總是保存會話。這也沒有幫助。

我無法解釋這種行爲。任何有助於解決問題的方法都將非常感謝。

+0

你是否檢查過問題不在於會話過期嗎?默認情況下,如果你沒有修改它,SESSION_COOKIE_AGE應該是2周。另外,當你不使用'SESSION_ENGINE ='django.contrib.sessions.backends.cache''時,你使用了什麼存儲器? – Ngenator 2013-03-11 14:02:47

+0

這個會話沒有過期,我正在使用memcached後端。切換到默認的數據庫會話後端沒有什麼區別。問題依然存在。 – CadentOrange 2013-03-11 14:28:10

+0

緩存是否填滿?如果您使用緩存進行會話,則不能保證它會被持久保存,除非您使用'cache_db' https://docs.djangoproject.com/zh/dev/topics/http/sessions/#using-cached-sessions – Ngenator 2013-03-11 15:03:02

回答

0

儘管我無法解決這個問題,但我發現了一種解決方法。我使用Django的低級緩存API手動將活動選項卡存儲在緩存中。

from django.core.cache import cache 


def save_viewer_tab(active, session_key, tab): 
    cache.set(session_key + ":" + str(tab), int(active)) 


def get_viewer_tab(session_key, tab, default=0): 
    return cache.get(session_key + ":" + str(tab), default) 


@csrf_exempt 
def update_active_tab_request(request): 
    """ 
    Stores the active tab for a given tab item 
    """ 
    session_key = request.session._session_key 
    for tab, active in request.GET.iteritems(): 
     save_viewer_tab(active, session_key, tab) 

    return HttpResponse("OK", status=200) 

它的工作可靠,但我仍然不明白爲什麼在會話中存儲標籤值的以前的代碼是不可靠的。

這是一個停止差距的措施,直到我找到一個合適的解決方案。