如何将会话变量设置为数据库中的值?

时间:2012-09-26 02:48:31

标签: python pylons pyramid

newb to python和pyramid / pylons。用户登录后,我想在我的数据库中获取一些数据并将其存储在会话变量中。我已经能够用remember()存储用户的登录ID。使用request.session,我可以设置一个会话变量,只要它是一个字符串,但如果我尝试从我的数据库中检索一些东西,我会收到一个错误:“BadPickleGet: ”。以下是我观点的相关部分:

if 'form.submitted' in request.params:
        login = request.params['login']
        password = request.params['password']
        if User.check_password(login, password):
            headers = remember(request, login) # ie dave
            session = request.session
            #session['myvar'] = 'somethinghardcoded' # this works!
            session['myvar'] = User.myfield # this doesn't work!
            session.save()
            return HTTPFound(location=came_from, headers=headers)

2 个答案:

答案 0 :(得分:5)

在您的示例中,您没有处理从数据库加载的User实例。这就像user = DBSession.query(User).filter_by(login).first()User.myfielduser.myfield之间存在很大差异,其中第一个只是Column对象或属性,第二个是数据库中特定行的实际数据。您的错误可能只是无法挑选Column对象。会话可以很好地挑选原始类型(整数,字符串等)。

答案 1 :(得分:0)

Pyramid Sessions

  

会话数据的键和值必须是可选择的。这通常意味着它们是基本类型对象的实例,例如字符串,列表,字典,元组,整数等。如果将对象放在会话数据键或不可拾取的值中,则会出现错误会话序列化时引发。

这意味着:您的数据无法被腌制,您需要提供一种方法来以可以腌制的格式返回它(我喜欢创建一个名为todict()的方法)。

但似乎存在第二个问题:

  

[...]在我的数据库中?

默认会话工厂(我假设您正在使用)不会将您的数据存储在数据库中,而是存储在cookie中(未加密的地方)。你可以看看pyramid_beaker,这对你来说可能是正确的。在这种情况下,您仍然需要可以被腌制的数据(字典,列表,字符串......)我假设,但是它在数据库中而不是在cookie中,因此您可以在其中存储机密信息(不要做)在默认情况下!)并删除长度限制(Cookie为4kB)。