0

新手到 python 和金字塔/塔。用户登录后,我想在我的数据库中获取一些数据并将其存储在会话变量中。我已经能够使用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)
4

2 回答 2

5

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

于 2012-09-26T14:09:13.903 回答
0

金字塔会议

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

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

但似乎还有第二个问题:

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

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

于 2012-09-26T09:17:00.070 回答