0

こんにちは私はユーザーがログインしたときにユーザー行を更新しようとしています。単にユーザーのログイン数を1つ増やしたいだけです。post_loginコントローラーメソッドのコードは次のとおりです。

@expose()  
def post_login(self, came_from=url('/')):  
    """  
    Redirect the user to the initially requested page on successful  
    authentication or redirect her back to the login page if login failed.  
    """  
    if not request.identity:  
        login_counter = request.environ['repoze.who.logins'] + 1  
        redirect(url('/user/login', came_from=came_from, __logins=login_counter))  

    user_name = request.identity['repoze.who.userid']
    user = User.by_user_name(user_name)
    user.tll_num_logins += 1
    user.tll_last_login = datetime.now()
    redirect(came_from)

ユーザーレコードは、データベースで更新されていないだけです。TGのドキュメントには、トランザクションマネージャーはすべてのトランザクションをフラッシュし、すべての未処理のSQLを自動的に実行する必要があると記載されていますが、更新では機能していないようです。手動でコミットした後にDBSession.commit()を挿入しようとしましたが、エラーメッセージが表示されます。同様に、DBSession.flush()をコントローラーメソッドに追加してもエラーは発生しませんが、実際にはレコードも更新されません。

4

2 に答える 2

2

申し訳ありませんが、TG2トランザクションマネージャーは結局機能していたことがわかりました。このエラーは、トランザクションマネージャーの外部でpost_login関数を呼び出していたため、レコードの更新がフラッシュされなかったために発生しました。なぜそれが私をコミットさせなかったのか分かりません。しかし、post_loginコントローラーを移動すると、指定した上記のコードが機能し、自動的に更新されます。DBSession.update(user)も必要ありません。

于 2010-01-07T17:02:39.933 に答える
1

オブジェクトを更新するようにセッションオブジェクトに指示する必要があります。

DBSession.update(user)
于 2010-01-07T14:39:14.780 に答える