2013-03-11 118 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) 

它的工作可靠,但我仍然不明白为什么在会话中存储标签值的以前的代码是不可靠的。

这是一个停止差距的措施,直到我找到一个合适的解决方案。