Django会话值偶尔不会持久化

时间:2013-03-11 12:02:53

标签: python django session

我有以下REST方法,每次单击jQuery选项卡以存储活动选项卡时,都会更新会话的值。

@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以始终保存会话。这也没有帮助。

我无法解释这种行为。任何帮助揭示这个问题的人都会非常感激。

1 个答案:

答案 0 :(得分: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)

它工作正常,但我仍然不明白为什么以前存储会话中选项卡值的代码不可靠。

这是一个停止间隙测量,直到找到合适的解决方案。