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