Django 如何在不注销的情况下清除所有会话变量

Django 如何在不注销的情况下清除所有会话变量,django,python-2.7,django-sessions,Django,Python 2.7,Django Sessions,我试图清除所有会话变量,但不注销当前用户 user = request.session.get('member_id', None) request.session.flush() request.session.modified = True request.session['member_id'] = user request.session.modified = True 这也会影响站点的其他用户吗?请求。会话在内部使用cookie。当用户请求站点的某个url时,只有该用户机器上存在的c

我试图清除所有会话变量,但不注销当前用户

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

这也会影响站点的其他用户吗?

请求。会话在内部使用cookie。当用户请求站点的某个url时,只有该用户机器上存在的cookie才会发送到服务器。因此,
request.session
始终绑定到当前用户

user = request.session.get('member_id', None)
request.session.flush()
request.session.modified = True
request.session['member_id'] = user
request.session.modified = True
因此,这绝不会影响网站的其他用户

此外,这不会注销当前用户,因为您正在使用
flush()
,这将删除旧会话并创建新会话,并且此新会话将与当前用户关联

flush()
在内部使用
clear()
delete()
create()


在响应中,此新会话的密钥将作为cookie发送,在后续请求中,此新会话将继续正常工作

在django<1.8版本中,删除会话数据并重新生成会话密钥。它不会影响其他用户,因为会话密钥是唯一的。

从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']

作为对Python2.x中shacker的改进,dict.keys()
返回字典键的列表副本,而在Python3.x中,它返回一个迭代器。更改迭代器的大小是不明智的。对于版本安全实现,强制转换到列表将防止任何大小问题

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

我之前的回答建议使用
dict.viewkeys()
,但它也将返回python 3.x中的迭代器。

您可以清除在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]

那么,为什么我在调用request.session.flush()时注销了它?它只在django 1.8+中出现过?因为至少有1.3don不明白为什么我在控制台中看不到会话对象上的方法?我通过Session.objects.get(Session_key=…)获取它,因为这与
request.Session
对象不同。如果您想在视图之外使用会话,请使用此模型,而不是
会话
模型。我收到一个错误:在请求中键入。Session.keys():RuntimeError:字典在迭代期间更改了大小。修复下面的问题。@AdamG在列表中收集关键点,然后在弥撒中删除它们。这是在修改当前正在迭代的iterable时出现的典型错误。替代方法:收集用户登录到dict session.flush()中所需的凭据,然后在dict上循环并将其放回会话中。