18

我正在尝试清除所有会话变量,但不注销当前用户。

user = request.session.get('member_id', None)
request.session.flush()
request.session.modified = True
request.session['member_id'] = user
request.session.modified = True

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

4

6 回答 6

24

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

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

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

for key in request.session.keys():
    del request.session[key]

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

del request.session['mykey']
于 2015-04-17T00:25:29.707 回答
15

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

于 2013-04-16T15:04:13.900 回答
5

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

for key in list(request.session.keys()):
    del request.session[key]

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

于 2016-04-13T20:45:29.183 回答
4

您可以清除在 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]
于 2018-02-08T12:04:05.457 回答
2

request.session内部使用cookies。当用户请求网站的某个 url 时,只有该用户机器上的 cookie 才会发送到服务器。因此,request.session始终与当前用户相关联。

因此,这绝不会影响网站的其他用户。

这也不会注销当前用户,因为您正在使用flush()它将删除旧会话并创建一个新会话,并且这个新会话将与当前用户相关联。

flush()内部使用clear(),delete()create().

在响应中,这个新会话的密钥将作为 cookie 发送,在后续请求中,这个新会话将继续正常工作。

于 2013-04-16T15:03:57.287 回答
2
session_keys = list(request.session.keys())
    for key in session_keys:
        del request.session[key]
于 2016-03-31T02:06:49.290 回答