2011-03-09 50 views
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 

回答

2

我沒有測試過這一點,但似乎用戶對象u是陳舊的,因爲你檢索它之前,你真正改變密碼。嘗試到

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

重置密碼後,它應該工作。

相關問題