1

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

我无法解释这种行为。任何有助于阐明问题的帮助将不胜感激。

4

1 回答 1

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)

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

在我找到合适的解决方案之前,这是一种权宜之计。

于 2013-03-12T10:08:55.660 回答