【问题标题】:Django session values occasionally not persistedDjango 会话值偶尔不会持久化
【发布时间】:2013-03-12 18:08:55
【问题描述】:

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

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

【问题讨论】:

  • 您是否检查过问题不在于您的会话即将到期?默认情况下SESSION_COOKIE_AGE 如果您没有修改它应该是 2 周。另外,您在不尝试使用SESSION_ENGINE='django.contrib.sessions.backends.cache'时使用的是什么存储
  • 会话没有过期,我正在使用 memcached 后端。切换到默认数据库会话后端并没有什么不同。问题依然存在。
  • 缓存是否被填满了?如果将缓存用于会话,则无法保证它会被持久化,除非您使用 cache_db docs.djangoproject.com/en/dev/topics/http/sessions/…
  • 我认为这与缓存已满无关。无论会话引擎如何,都会出现我面临的问题。我只是切换到缓存后端来测试一下。

标签: python django session


【解决方案1】:

虽然我无法解决此问题,但我发现了一种解决方法。我使用 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)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2012-11-20
    • 2012-03-17
    • 2021-05-03
    • 2021-04-29
    • 2014-09-08
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多