2011-03-09 2 views
0

내장 된 사용자 모델을 보완하는 데 사용하는 프로필 모델이 있습니다. 다음과 같이 사용자의 비밀번호를 재설정하는 기능을 만들었습니다.왜 내 장고 암호가 달라 붙지 않습니까?

def _reset_password(self): 
    import random, string 
    password = ''.join(random.choice(string.letters+string.digits) for i in range(10)) 
    u = self.user 
    u.set_password(password) 
    u.save() 
    print u.check_password(password) 
    return password 

내 문제의 핵심은 세 줄로 요약 할 수 있습니다. _reset_password에서 check_password 시도가 성공적이기 때문에

 
>>> p = Profile.objects.all()[0] 
>>> u = User.objects.get(profile = p) 
>>> u.check_password(p._reset_password()) 
True 
False 
>>> 

그것은 True를 인쇄합니다. 그런 다음 재설정 된 암호가 아무렇게나 붙지 않았으므로 False을 인쇄합니다. 그리고 이제는 조금 더 천천히 강조합니다.

 
>>> password = p._reset_password() 
True 
>>> password 
'uvb9SdPOwr' 
>>> u.check_password(password) 
False 
>>> u.set_password(password) 
>>> u.save() 
>>> u.check_password(password) 
True 
>>> 

의견이 있으십니까? 나는 심각하게 아이디어가 부족하다. 내가 틀린 뭔가가 있어야한다는 것을 압니다. 그러나 저의 삶을 위해 그것을 볼 수는 없습니다. 나는 컴퓨터가 결정 론적이라는 것을 알고 있지만 이것은 분명히 다른 효과를 만들어내는 코드 라인을 닮았다.

해결책 : 미쿠 말했듯이

, 내 사용자가 부실했다. 그러나 그 오류는 실제 모델 코드가 아닌 커맨드 라인 테스트에있었습니다. 실제로을 변경하기 전에 당신이 그것을 검색하기 때문에, 나는이 테스트를하지 않은

 
p = u.profile 
p._reset_password() #fail 
u.blah = 'foo' 
u.save() # u has old password, saving undoes line 2 
p._reset_password() # this one takes because the stale u is never saved again 

답변

2

, 그러나 당신의 사용자 개체 u가 오래된 것 같다 : 실제 (그리고 동일한) 문제의 위치는보기에 있었다 암호.

u = User.objects.get(profile = p) 

암호를 재설정하면 올바르게 작동합니다.

관련 문제