我正在尝试清除所有会话变量,但不注销当前用户。
user = request.session.get('member_id', None)
request.session.flush()
request.session.modified = True
request.session['member_id'] = user
request.session.modified = True
这也会影响网站的其他用户吗?
我正在尝试清除所有会话变量,但不注销当前用户。
user = request.session.get('member_id', None)
request.session.flush()
request.session.modified = True
request.session['member_id'] = user
request.session.modified = True
这也会影响网站的其他用户吗?
从 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']
在 django < 1.8session.flush
的版本中,删除会话数据并重新生成会话密钥。它不会影响其他用户,因为会话密钥是唯一的。
作为对Python 2.x中 shacker 1dict.keys()
的改进,它返回字典键的列表副本,在 Python 3.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
内部使用cookies。当用户请求网站的某个 url 时,只有该用户机器上的 cookie 才会发送到服务器。因此,request.session
始终与当前用户相关联。
因此,这绝不会影响网站的其他用户。
这也不会注销当前用户,因为您正在使用flush()
它将删除旧会话并创建一个新会话,并且这个新会话将与当前用户相关联。
flush()
内部使用clear()
,delete()
和create()
.
在响应中,这个新会话的密钥将作为 cookie 发送,在后续请求中,这个新会话将继续正常工作。
session_keys = list(request.session.keys())
for key in session_keys:
del request.session[key]