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

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

以上是关于如何清除所有会话变量而不退出的主要内容,如果未能解决你的问题,请参考以下文章

在应用程序退出时清除数据

退出 php 命令而不触发关机功能

我将如何清除所有 Rails 会话?

声明堆栈变量而不指定名称并获取指针

用户在 ASP .NET MVC 5 中注销时如何清除所有会话元素?

如何清除ipython中的变量?