我正在尝试使用Pyramid框架实现电子邮件确认。 这是在数据库中确认用户并将其重定向到主页的代码。
user = DbSession.query(User).filter_by(email=email).one()
if user.approved:
return {'msg': _('Already approved')}
if user.check_approve_token(hash):
user.approved = True
self.request.session.save()
self.request.session['user'] = user
return HTTPFound(self.request.route_url('home'),
headers=remember(self.request, user.guid))
当我尝试从另一个处理程序获取self.request.session['user']
变量时,我得到DetachedInstanceError: Instance <User at 0x42902f0> is not bound to a Session; attribute refresh operation cannot proceed
。据我所知,由于User
实例的修改,引发了这个错误。我该如何解决?
先谢谢你,伊万。
答案 0 :(得分:15)
错误是因为模型对象(user
)由会话(DbSession
)管理。当您将实例存储在会话(request.session
)中,然后在另一个请求中再次访问它时,这将使用不同的DbSession
。支持在会话之间移动托管对象,但不支持自动。从request.session
检索对象时,您可以通过DbSession
将其合并到新user = DbSession.merge(user)
。
http://docs.sqlalchemy.org/en/latest/orm/session.html?highlight=merge#merging