我正在尝试清除所有会话变量但不注销当前用户。
user = request.session.get('member_id', None)
request.session.flush()
request.session.modified = True
request.session['member_id'] = user
request.session.modified = True
这是否会影响网站的其他用户?
答案 0 :(得分:17)
从Django 1.8开始,对flush()
的任何调用都将注销用户。来自docs:
在Django 1.8中更改:删除会话cookie是一种行为 Django 1.8中的新功能。以前,行为是重新生成 在cookie中发回给用户的会话密钥值。
如果您希望能够删除密钥但保持用户登录,则需要手动处理:
for key in request.session.keys():
del request.session[key]
或者只删除有关的特定键:
del request.session['mykey']
答案 1 :(得分:14)
在django<版本中1.8,session.flush
删除会话数据并重新生成会话密钥。它不会影响其他用户,因为会话密钥是唯一的。
答案 2 :(得分:4)
作为对Python中的shacker 1的改进2.x dict.keys()
返回字典键的列表副本,在Python 3.x中它返回一个迭代器。改变迭代器的大小是不明智的。对于版本安全的实现,转换为列表将防止任何大小问题
for key in list(request.session.keys()):
del request.session[key]
我之前的回答建议使用dict.viewkeys()
,但它也会在python 3.x中返回一个迭代器。
答案 3 :(得分:2)
session_keys = list(request.session.keys())
for key in session_keys:
del request.session[key]
答案 4 :(得分:2)
你可以清除你在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]
答案 5 :(得分:1)
request.session
内部使用Cookie。当用户请求网站的某个网址时,只有该用户计算机上存在的cookie才会发送到服务器。因此,request.session
始终与当前用户绑定。
因此,这绝不会影响网站的其他用户。
此时也不会注销当前用户,因为您正在使用flush()
删除旧会话并创建新会话,此新会话将与当前用户关联。
flush()
在内部使用clear()
,delete()
和create()
。
在响应中,此新会话的密钥将作为cookie发送,并且在后续请求中,此新会话将继续正常工作。