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