2010-01-07 3 views
0

안녕하세요, 사용자 로그인시 사용자 행을 업데이트하려고합니다. 단순히 사용자 로그인 수를 1만큼 늘리고 싶습니다.turbogears에서 DBSession을 사용하여 레코드를 업데이트하는 방법 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) 

사용자 레코드가 단순히 데이터베이스 업데이트지고 밤은 : 여기 post_login 컨트롤러 방식의 코드입니다. TG 설명서에 따르면 트랜잭션 관리자가 모든 트랜잭션을 플러시하고 모든 미해결 SQL을 자동으로 실행해야하지만 업데이트가 제대로 작동하지 않는 것으로 보입니다. 나는 수동으로 커밋하지만 오류 메시지가 나타나면 DBSession.commit()을 넣으려고했습니다. 마찬가지로 컨트롤러 메서드에 DBSession.flush()를 추가해도 오류는 발생하지 않지만 레코드를 실제로 업데이트하지는 않습니다.

+1

DBSession.commit()에서 어떤 오류 메시지가 나타 납니까? – codeape

답변

2

모든 죄송합니다 TG2 트랜잭션 매니저가 결국 일하는 밝혀졌습니다. 트랜잭션 관리자 외부에서 post_login 함수를 호출하여 레코드 업데이트가 플러시되지 않았기 때문에 오류가 발생했습니다. 왜 내가 커밋하지 않는지 모르겠다. 하지만 post_login 컨트롤러를 옮겨서 위의 코드를 지정하면 작업이 자동으로 업데이트됩니다. DBSession.update (사용자)도 필요 없습니다.

1

당신은 개체를 업데이트하는 세션 객체를 알려야합니다 :

DBSession.update(user) 
+1

이 코드 조각은 TG2에서 작동하지 않습니다. – Claris