开发者

Why is my django password change not sticking?

I have a profile model I use to supplement the built in User model. I've made a function to reset the password of a user as follows:

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

The heart of my problem can be summed up in three lines.

>>> p = Profile.objects.all()[0]
>>> u = User.objects.get(profile = p)
>>> u.check_password(p._reset_password())
True
False
>>>

It prints True because the check_password attempt in _reset_password is successful. It then prints False because the reset password somehow didn't stick. And now again a bit more slowly for emphasis.

>>> password = p._reset_password()
True
>>> password
'uvb9SdPOwr'
>>> u.check_password(password)
False
>>> u.set_password(password)
>>> u.save()
>>> u.check_password(password)
True
>>>

Any thoughts? I've seriously run out of ideas. I know there must be something wrong but I can't see it for the life of me. I know computers are deterministic and all, but this very clearly looks to me like the lines of code producing different effects.

Solution:

As miku said, my user was stale. But that error was in my command li开发者_开发知识库ne test, not the actual model code. The location of the real (and exact same) problem was in the view:

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


I haven't tested this, but it seems that your user object u is stale, because you retrieved it before you actually change the password. Try to

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

after you reset the password and it should work.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜