2011-11-06 70 views
1

我正在使用web.py在python中创建一个webapp,我已经设置了表并且可以登录用户和所有内容,但会话的初始化程序doesn似乎没有用。Webpy会话:AttributeError:'ThreadedDict'对象没有'username'属性

我有以下的在我的代码:

store = web.session.DBStore(db, 'sessions') 
session = web.session.Session(app, store, initializer={'logged_in': 0, 'username': ''}) 

render = web.template.render('templates/', base='base', globals={'session': session, 'username': session.username}) 

但这引发错误: AttributeError的: 'ThreadedDict' 对象有没有属性 '用户名'

可以做些什么?我基本上只是遵循这里的示例:
http://webpy.org/cookbook/sessions

回答

2

会话只在处理请求时加载,在安装期间无法获取其属性。

+0

所以我想通了,但它现在工作,只是不问我多么大声笑,因为我不知道。 此外,我不得不覆盖默认的web.py会话类,使整个域的会话全局,而不是每个唯一的网址有自己的会话cookie,这对我来说真的没有意义。 – Ole

+0

您不必为此目的创建子类Session,只需设置会话参数:'web.config.session_parameters.update(cookie_name =“tasty_cookie”,cookie_domain =“mydomain.com”)' –

+0

域名是一回事,路径是另一个路径,它被设置为例如''** **,'/ login /'用于**登录**等等,因此会话cookie根本不可用。我只是将路径静态设置为'“/”',它突然像魅力一样工作 – Ole

3

我有同样的问题,所以我用_initializer属性来获取会话数据。

下面是一个例子:

store = web.session.DBStore(db, 'sessions') 
session = web.session.Session(app, store, initializer={'logged_in': 0, 'username': ''}) 

session_data = session._initializer 
render = web.template.render('templates/', base='base', globals={'session': session_data, 'username': session_data['username']}) 

然后,您可以访问所有从会话初始化声明的数据。如果有人有更好的方法,请让我知道。

PS:我知道它的晚,但亡羊补牢,然后永远...

+0

这是一个很好的解决方案。获得会议变种像这样:session_data ['logged_in'] - 谢谢Antonis。 – Boz

1

您正在试图将它设置之前得到一个会话变量。

我注意到session.username在某些情况下工作。但是在WSGI下它失败了。

这工作得很好,是在webpy文档:

session.get('username', False)

不:

session.username

如果您想使用预设的初始化,在使用的方法@安东尼卡卡洛的答案。

session_data = session._initializer 
session.get('username', session_data['username']) 
+0

@ Antonis-kalou查看以上详情。 3年后 - 但我刚才有这个问题,所以我想这仍然是相关的。 – Boz