2013-03-11 132 views
1

我想检查会话是否有任何内容。我做的是:django会话检查存在

if request.session: 
    # do something 

但它不工作。有什么方法可以知道会话是否包含某些内容?

如果我做request.session['some_name'],它的工作原理,但在某些情况下,我只需要知道会话是否为空。问一些具体的名字并不总是想要的东西。例如。如果没有会话,则返回错误,因为some_name不存在。

感谢您的帮助。

+1

'request.session'是字典,所以你可以尝试'如果len(request.session.keys())> 0'来检查任何存在的项目。 – Rohan 2013-03-11 07:20:37

+1

@Rohan'request.session'不是字典。它是一个'SessionBase'对象的实例,其行为像字典。 – freakish 2013-03-11 07:31:49

回答

5

request.sessionSessionBase对象的一个​​实例,它的行为类似于字典,但它不是字典。这个对象有一个名为_session的“private”字段(实际上是一个属性),它是一个保存所有数据的字典。

原因是Django在调用request.session[key]之前不会加载会话。它被懒惰地实例化。

所以,你可以试着这样做:

if request.session._session: 
    # do something 

,或者您可以通过查看键这样做:

if request.session.keys(): 
    # do something 

注意如何.keys()作品:

Django的/的contrib /sessions/backends/base.py

class SessionBase(object): 
    # some code 

    def keys(self): 
     return self._session.keys() 

    # some code 

我总是建议直接阅读源代码。

+0

正如上面的@freakish所提到的,只需通过执行'request.session._session',就可以在django中获得一堆会话,它将返回一个会话密钥,其值为'dict' – 2015-04-08 10:06:36