Это может произойти при изменении настройки SESSION_COOKIE_DOMAIN
. (Вы указали, что SESSION_COOKE_PATH
было изменено).
Документация SESSION_COOKIE_DOMAIN
приходит с этим предупреждением:
SESSION_COOKIE_DOMAIN
Будьте осторожны при обновлении этого параметра на производственной площадке. Если вы установили , чтобы разрешить использование междоменных куки-файлов на сайте, которые ранее использовали стандартные куки-файлы домена, существующие файлы cookie домена будут установлены в старый домен. Это может привести к тому, что они не смогут войти в систему , пока эти куки сохраняются.
Это может произойти, если вы пошли с:
SESSION_COOKIE_DOMAIN = None
в
SESSION_COOKIE_DOMAIN = '.domain.com'
Как вы уже говорилось, в настоящее время существует два печенья на стороне клиента, которые будут отправлены в сервера во время запроса, оба файла cookie с именем sessionid
. Когда Django просматривает файлы cookie, он имеет доступ только к словарю Python, поэтому он видит только один файл cookie sessionid
, а не тот, который был отправлен.
Я не проверял, но некоторые идеи для крепления проблем могут быть:
Попросите пользователь удалить соответствующий куки. В зависимости от количества пользователей и уровня их квалификации это может быть не разумным вариантом. Попросить их удалить ВСЕ их файлы cookie может быть и речи.
Подождите, пока старые куки исчезнут. По умолчанию, похоже, что cookie sessionid
имеет 14-дневный срок действия. Как только старые файлы cookie сеанса истекают, они больше не будут отправляться с каждым запросом, позволяя новому cookie sessionid
вступить в силу.
Измените имя cookie sessionid
и напишите собственное промежуточное программное обеспечение Django, чтобы обрабатывать как старые, так и новые файлы cookie sessionid
.
Я не тестировал последнюю точку, но это должно быть возможно изменить SESSION_COOKIE_NAME
к чему-то другому, чем sessionid
.Теперь это позволит запретить существующим зарегистрированным пользователям использовать их существующие файлы cookie sessionid
, поэтому вам нужно будет написать собственное промежуточное программное обеспечение, которое могло бы обрабатывать как cookie sessionid
(для старых файлов cookie), так и sessionidnew
куки для текущих входов в систему.
Что-то, как это будет работать:
from django.utils.importlib import import_module
from django.contrib.sessions import middleware
from django.conf import settings
class MySessionMiddleware(middleware.SessionMiddleware):
def process_request(self, request):
engine = import_module(settings.SESSION_ENGINE)
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)
if session_key is None:
# Look for old cookie in request for auth purposes.
session_key = request.COOKIES.get('sessionid', None)
request.session = engine.SessionStore(session_key)
Вы должны были бы заменить SessionMiddleware
в settings.py
под MIDDLEWARE_CLASSES
с этим новым ППО. Например: Изменение 'django.contrib.sessions.middleware.SessionMiddleware'
в 'custommiddleware.MySessionMiddleware'
где custommiddleware.py находится файл с кодом выше и присутствует в корневой папке проекта (где manage.py файл присутствует)
После достаточно времени прошло, и вы будете удовлетворены, что все старые cookie sessionid
истекли, вы можете сделать обратное и вернуться к использованию sessionid
в качестве предпочтительного имени cookie для сеансов, в результате чего удалите код специалиста, который может обрабатывать два разных типа файлов cookie sessionid
.
Да, я имел в виду '' '' SESSION_COOKIE_DOMAIN''', опечатал его как '' '' SESSION_COOKIE_PATH'''. Изменение имени cookie сеанса - это аккуратный трюк и будет работать в этом случае. Спасибо, что указали! – jorilallo