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

Sie*_*cje 17 django django-sessions python-2.7

我试图清除所有会话变量但不注销当前用户.

user = request.session.get('member_id', None)
request.session.flush()
request.session.modified = True
request.session['member_id'] = user
request.session.modified = True
Run Code Online (Sandbox Code Playgroud)

这还会影响网站的其他用户吗?

sha*_*ker 18

从Django 1.8开始,任何调用flush()都会注销用户.来自文档:

在Django 1.8中更改:删除会话cookie是Django 1.8中的新行为.以前,行为是重新生成在cookie中发送回用户的会话密钥值.

如果您希望能够删除密钥但保持用户登录,则需要手动处理:

for key in request.session.keys():
    del request.session[key]
Run Code Online (Sandbox Code Playgroud)

或者只删除关注的特定键:

del request.session['mykey']
Run Code Online (Sandbox Code Playgroud)

  • 我收到一个错误:for request in request.session.keys():RuntimeError:字典在迭代期间改变了大小.修复如下. (7认同)

Nge*_*tor 14

在django <1.8的版本中,session.flush删除会话数据并重新生成会话密钥.它不会影响其他用户,因为会话密钥是唯一的.

  • 它已经存在至少1.3 (3认同)
  • 因为那与`request.session`对象不同.如果要使用视图之外的会话,请使用此https://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-out-of-views而不是"Session"模型. (3认同)

tal*_*oaj 6

您可以清除在 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]
Run Code Online (Sandbox Code Playgroud)


小智 5

作为对Python 2.x 中shacker 1的改进,dict.keys()它返回字典键的列表副本,而在 Python 3.x 中,它返回一个迭代器。改变迭代器的大小是不明智的。对于版本安全的实现强制转换到列表将防止任何大小问题

for key in list(request.session.keys()):
    del request.session[key]
Run Code Online (Sandbox Code Playgroud)

我之前的回答建议使用dict.viewkeys()但它也会在 python 3.x 中返回一个迭代器。