2012-03-14 11 views
4

私はPyramidフレームワークを使用して電子メールの確認を実装しようとしています。 データベース内のユーザーを確認し、ホームページにリダイレクトするコードは次のとおりです。Pyramid/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インスタンスの変更のために発生しました。どうすれば修正できますか?

ありがとうございます、Ivan。

答えて

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

関連する問題