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)
答案 0 :(得分:5)
在您的示例中,您没有处理从数据库加载的User
实例。这就像user = DBSession.query(User).filter_by(login).first()
。 User.myfield
和user.myfield
之间存在很大差异,其中第一个只是Column
对象或属性,第二个是数据库中特定行的实际数据。您的错误可能只是无法挑选Column
对象。会话可以很好地挑选原始类型(整数,字符串等)。
答案 1 :(得分:0)
会话数据的键和值必须是可选择的。这通常意味着它们是基本类型对象的实例,例如字符串,列表,字典,元组,整数等。如果将对象放在会话数据键或不可拾取的值中,则会出现错误会话序列化时引发。
这意味着:您的数据无法被腌制,您需要提供一种方法来以可以腌制的格式返回它(我喜欢创建一个名为todict()
的方法)。
但似乎存在第二个问题:
[...]在我的数据库中?
默认会话工厂(我假设您正在使用)不会将您的数据存储在数据库中,而是存储在cookie中(未加密的地方)。你可以看看pyramid_beaker,这对你来说可能是正确的。在这种情况下,您仍然需要可以被腌制的数据(字典,列表,字符串......)我假设,但是它在数据库中而不是在cookie中,因此您可以在其中存储机密信息(不要做)在默认情况下!)并删除长度限制(Cookie为4kB)。