2013-04-16 94 views
16

我想清除所有的会话变量但不能注销当前用户。如何清除所有会话变量而不会被注销

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

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

回答

13

在Django 1.8中,任何对flush()的调用都会注销用户。从docs

Changed in Django 1.8: Deletion of the session cookie is a behavior new in Django 1.8. Previously, the behavior was to regenerate the session key value that was sent back to the user in the cookie.

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

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

或者只是删除特定按键即值得关注的:

del request.session['mykey'] 
+5

我得到一个错误:对于request.session.keys()中的键: RuntimeError:迭代期间字典更改大小。下面修复。 – AdamG

1

request.session内部使用cookie。当用户请求网站的某个网址时,只有该用户计算机上存在的Cookie才会发送到服务器。所以,request.session总是绑定到当前用户。

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

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

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

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

+0

那么,为什么我得到登出当我打电话request.session.flush() – Siecje

11

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

+0

它只是在Django 1.8 +? – aRkadeFR

+3

它一直在那里,因为至少1.3 – Ngenator

+0

不明白为什么我没有看到控制台中的Session对象的方法? 我通过Session.objects.get(session_key = ...)获取它 – aRkadeFR

1
session_keys = list(request.session.keys()) 
    for key in session_keys: 
     del request.session[key] 
3

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

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

我以前的答复建议选用dict.viewkeys()但它也将在Python 3.x中返回一个迭代

0

您可以清除您在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]