如何清除所有会话变量而不退出

时间:2013-04-16 14:11:23

标签: 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

这是否会影响网站的其他用户?

6 个答案:

答案 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发送,并且在后续请求中,此新会话将继续正常工作。