2010-01-07 16 views
0

Salut J'essaie de mettre à jour une ligne d'utilisateur lors de la connexion de l'utilisateur. Je veux simplement augmenter le compte de connexion des utilisateurs par un. Voici le code dans la méthode du contrôleur de post_login:comment mettre à jour un enregistrement en utilisant DBSession dans turbogears 2

@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) 

L'enregistrement utilisateur isnt simplement se mis à jour dans la base de données. La documentation TG indique que le gestionnaire de transactions doit vider toutes les transactions et exécuter automatiquement tout le SQL en suspens, mais il ne semble pas fonctionner avec la mise à jour. J'ai essayé de mettre dans un DBSession.commit() après pour commettre manuellement mais obtenir un message d'erreur. De même, l'ajout de DBSession.flush() à la méthode du contrôleur n'entraîne pas d'erreur mais ne met pas à jour l'enregistrement.

+1

Quel message d'erreur obtenez de DBSession.commit()? – codeape

Répondre

2

Désolé tout, tourne le gestionnaire de transactions TG2 travaillait après tout. L'erreur est survenue parce que j'appelais la fonction post_login en dehors du gestionnaire de transactions et que la mise à jour de l'enregistrement n'était donc pas vidée. Je ne sais pas pourquoi ça ne me laissait pas m'engager. Mais j'ai déplacé le contrôleur de post_login et maintenant le code ci-dessus j'ai fonctionné, il met à jour automatiquement - pas besoin même de DBSession.update (utilisateur).

1

Vous devez indiquer l'objet de session pour mettre à jour l'objet:

DBSession.update(user) 
+1

Cet extrait de code ne fonctionne pas dans TG2. – Claris