如何清除所有会话变量而不退出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何清除所有会话变量而不退出相关的知识,希望对你有一定的参考价值。
我试图清除所有会话变量但不注销当前用户。
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:
在Django 1.8中更改:删除会话cookie是Django 1.8中的新行为。以前,行为是重新生成在cookie中发送回用户的会话密钥值。
如果您希望能够删除密钥但保持用户登录,则需要手动处理:
for key in request.session.keys():
del request.session[key]
或者只删除关注的特定键:
del request.session['mykey']
在django <1.8的版本中,session.flush
删除会话数据并重新生成会话密钥。它不会影响其他用户,因为会话密钥是唯一的。
作为对Python 2.x中shacker's1的改进,dict.keys()
返回字典键的列表副本,在Python 3.x中它返回一个迭代器。改变迭代器的大小是不明智的。对于版本安全的实现,转换为列表将防止任何大小问题
for key in list(request.session.keys()):
del request.session[key]
我之前的回答建议使用dict.viewkeys()
,但它也会在python 3.x中返回一个迭代器。
session_keys = list(request.session.keys())
for key in session_keys:
del request.session[key]
你可以清除你在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。当用户请求网站的某个网址时,只有该用户计算机上存在的cookie才会发送到服务器。所以,request.session
总是与当前用户联系在一起。
因此,这绝不会影响网站的其他用户。
此外,这不会注销当前用户,因为您正在使用flush()
,它将删除旧会话并创建新会话,并且此新会话将与当前用户关联。
flush()
内部使用clear()
,delete()
和create()
。
在响应中,此新会话的密钥将作为cookie发送,并且在后续请求中,此新会话将继续正常工作。
以上是关于如何清除所有会话变量而不退出的主要内容,如果未能解决你的问题,请参考以下文章