Переменные сессии 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 () - это
- запускается через запросы AJAX
- используется для множества различных операций, которые могут быть вызваны одновременно
- может вызываться несколько раз за операцию за один сеанс
Этот код прекрасно работает в моей локальной среде. Однако на рабочем сервере, где установлены gevent и chausette, происходит сбой.
В большинстве случаев request.session.get(operation.name) будет возвращать None, даже если get_result вызывается для этой операции не первый раз. В некоторых случаях он возвращает значение, но в некоторых - нет. Кажется, нет никакой картины, когда это работает и не работает.
Я подозреваю, что несоответствие связано с тем, что разные потоки ссылаются на переменную сеанса в разных состояниях. Каков будет правильный способ обработки переменных сеанса в этом случае?
1 ответ
На самом деле у меня были те же проблемы, и я также пытался правильно сохранить сеанс с помощью настроек, которые вы опубликовали.
В конце концов, мою проблему решило изменение кеша по умолчанию вsettings.py
к
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
С использованиемFileBasedCache
вместо этого тоже помогает, но в локальной среде (разработка) происходит сбой. Манекен работает как на местное, так и на производство.