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

Это довольно простая процедура, и проблема у меня в том, что оно, что значение не всегда сохраняется в сессии. Я просмотрел журналы веб-сервера, и я поместил заявления о ведении журнала, чтобы убедиться, что этот код вызывается. Кажется, что все работает, но я обнаружил, что есть шанс, что сеанс не был обновлен, когда этот метод вернется.

Думаю, что это может быть проблема с производительностью/синхронизацией при обновлении сеанса, я изменил хранилище сеансов на 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

+0

Сессия не истекла, и я использую сервер memcached. Переход к базовому серверу сеанса базы данных по умолчанию не имеет значения. Проблема все еще сохраняется. – CadentOrange

+0

Является ли кеш как-то заполняющим? Если вы используете кеш для сеансов, нет никакой гарантии, что он будет сохранен, если вы не используете 'cache_db' https://docs.djangoproject.com/en/dev/topics/http/sessions/#using-cached-sessions – Ngenator

ответ

0

Хотя я не смог это исправить, я обнаружил обходное решение. Я вручную сохраняю активную вкладку в кеше с помощью API кеша низкого уровня Django.

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) 

Он надежно работает, но я до сих пор не понимаю, почему предыдущий код, который хранится значение вкладок в сессии была ненадежной.

Это мера остановки, пока я не найду правильное решение.

Смежные вопросы