У меня есть модель профиля, которую я использую для дополнения встроенной пользовательской модели. Я сделал функцию сброса пароля пользователя следующим образом:
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