我想清除所有的会话变量但不能注销当前用户。如何清除所有会话变量而不会被注销
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()的调用都会注销用户。从docs:
Changed in Django 1.8: Deletion of the session cookie is a behavior new in Django 1.8. Previously, the behavior was to regenerate the session key value that was sent back to the user in the cookie.
如果您希望能够删除键,但保持用户登录,您需要手动处理:
for key in request.session.keys():
del request.session[key]
或者只是删除特定按键即值得关注的:
del request.session['mykey']
request.session
内部使用cookie。当用户请求网站的某个网址时,只有该用户计算机上存在的Cookie才会发送到服务器。所以,request.session
总是绑定到当前用户。
因此,这绝不会影响该网站的其他用户。
此外,这不会注销当前用户,因为您正在使用flush()
,这将删除旧会话并创建一个新会话,并且此新会话将与当前用户关联。
flush()
内部使用clear()
,delete()
和create()
。
在响应中,此新会话的密钥将作为cookie发送,并且在随后的请求中,此新会话将继续正常工作。
那么,为什么我得到登出当我打电话request.session.flush() – Siecje
在版本的django < 1.8,session.flush
删除会话数据并重新生成会话密钥。它不会影响其他用户,因为会话密钥是唯一的。
session_keys = list(request.session.keys())
for key in session_keys:
del request.session[key]
由于在Python 2的改进shacker的1 .x dict.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.keys()中的键: RuntimeError:迭代期间字典更改大小。下面修复。 – AdamG