2012-03-14 62 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