Как очистить все переменные сеанса без выхода из системы

Я пытаюсь очистить все переменные сеанса, но не выйти из текущего пользователя.

user = request.session.get('member_id', None)
request.session.flush()
request.session.modified = True
request.session['member_id'] = user
request.session.modified = True

Это также повлияет на других пользователей сайта?

Ответы

Ответ 1

Начиная с Django 1.8, любой вызов flush() приведет к выходу пользователя из системы. Из документов:

Изменено в Django 1.8: удаление файла cookie сеанса - новое поведение в Django 1.8. Раньше поведение было в том, чтобы восстановить значение ключа сеанса, которое было отправлено обратно пользователю в файле cookie.

Если вы хотите иметь возможность удалять ключи, но сохраняете пользователя в системе, вам нужно будет обработать его вручную:

for key in request.session.keys():
    del request.session[key]

Или просто удалите конкретные ключи, которые вызывают беспокойство:

del request.session['mykey']

Ответ 2

В версиях django <1.8, session.flush удаляет данные сеанса и восстанавливает ключ сеанса. Это не повлияет на других пользователей, так как сеансовые ключи уникальны.

Ответ 3

В качестве улучшения для 1 shacker в Python 2.x dict.keys() возвращает копию списка ключей словаря в Python 3.x. вместо этого возвращает итератор. изменение размера итератора неразумно. Для безопасной реализации версии в листинге список предотвратит любые проблемы с размером

for key in list(request.session.keys()):
    del request.session[key]

В моем предыдущем ответе было предложено использовать dict.viewkeys(), но он также вернет итератор в python 3.x.

Ответ 4

session_keys = list(request.session.keys())
    for key in session_keys:
        del request.session[key]

Ответ 5

Вы можете очистить ключи, которые вы установили в сеансе django, но сделать это без входа пользователя в систему немного хитро; request.session.flush() выводит пользователя из системы. И request.session = {} при удалении всех ключей в словаре сеанса также выйдет из системы.

Таким образом, чтобы очистить ключи без выхода пользователя из системы, вы должны избегать клавиш, которые начинаются с символа подчеркивания. Следующий код делает свое дело:

for key in list(request.session.keys()):
  if not key.startswith("_"): # skip keys set by the django system
    del request.session[key]

Ответ 6

request.session внутренне использует файлы cookie. И когда пользователь запрашивает некоторый URL-адрес сайта, на сервер отправляются только куки, присутствующие на этом компьютере пользователя. Таким образом, request.session всегда привязывается к текущему пользователю.

Таким образом, это никоим образом не повлияет на других пользователей сайта.

Также это не будет выходить из текущего пользователя, потому что вы используете flush(), который удалит старый сеанс и создаст новый сеанс, и этот новый сеанс будет связан с текущим пользователем.

flush() внутренне использует clear(), delete() и create().

В ответ этот новый ключ сеанса будет отправлен как файл cookie, и в последующих запросах этот новый сеанс будет продолжать работать нормально.