Переменные сессии Django иногда теряются в многопоточной среде

Я пытаюсь кэшировать набор строк для каждой сессии, сохраняя каждую из них в своей собственной переменной и используя django.contrib.session.

У меня есть следующий код:

import copy

def get_result(request, operation):
    previous_result = request.session.get(operation.name)
    if previous_result:
        result = copy.deepcopy(previous_result)
    else:
        result = get_json_response(operation)
        request.session[operation.name] = copy.deepcopy(result)
    return result

get_result () - это

  1. запускается через запросы AJAX
  2. используется для множества различных операций, которые могут быть вызваны одновременно
  3. может вызываться несколько раз за операцию за один сеанс

Этот код прекрасно работает в моей локальной среде. Однако на рабочем сервере, где установлены gevent и chausette, происходит сбой.

В большинстве случаев request.session.get(operation.name) будет возвращать None, даже если get_result вызывается для этой операции не первый раз. В некоторых случаях он возвращает значение, но в некоторых - нет. Кажется, нет никакой картины, когда это работает и не работает.

Я подозреваю, что несоответствие связано с тем, что разные потоки ссылаются на переменную сеанса в разных состояниях. Каков будет правильный способ обработки переменных сеанса в этом случае?

1 ответ

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

В конце концов, мою проблему решило изменение кеша по умолчанию вsettings.pyк

      'BACKEND': 'django.core.cache.backends.dummy.DummyCache',

С использованиемFileBasedCacheвместо этого тоже помогает, но в локальной среде (разработка) происходит сбой. Манекен работает как на местное, так и на производство.

Другие вопросы по тегам