Почему моя смена пароля в django не происходит? - PullRequest
0 голосов
/ 09 марта 2011

У меня есть модель профиля, которую я использую для дополнения встроенной пользовательской модели. Я сделал функцию сброса пароля пользователя следующим образом:

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

1 Ответ

2 голосов
/ 09 марта 2011

Я не проверял это, но кажется, что ваш пользовательский объект u устарел, потому что вы получили его до того, как фактически изменили пароль.Попробуйте

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

после сброса пароля, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...