0
我有一個配置文件模型,我用它來補充內置的用戶模型。我做了一個功能重置用戶的密碼的方法如下:爲什麼我的django密碼更改不會粘住?
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
我的問題的心臟可在三條線來概括。
>>> p = Profile.objects.all()[0] >>> u = User.objects.get(profile = p) >>> u.check_password(p._reset_password()) True False >>>
它打印True
因爲check_password
企圖_reset_password
成功。然後它打印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