2012-03-14 33 views
4

我试图使用金字塔框架来实现电子邮件确认。 下面是确认数据库中的用户并将其重定向到主页的代码。金字塔/ SQL Alchemy DetachedInstanceError

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实例的修改而引发此错误。我该如何解决它?

在此先感谢,伊万。

回答

15

错误是因为模型对象(user)由会话管理(DbSession)。当您将实例存储在会话中(request.session),然后在另一个请求中再次访问该实例时,它将使用不同的DbSession。在会话之间移动受管理的对象是受支持的,但不是自动的。当从request.session中检索对象时,可以通过user = DbSession.merge(user)将它合并到新的DbSession中。

http://docs.sqlalchemy.org/en/latest/orm/session.html?highlight=merge#merging