为什么我的django密码更改不坚持?

时间:2011-03-09 18:10:18

标签: python 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
>>>

有什么想法?我认真地用尽了想法。我知道一定有什么不对的,但我不能在生活中看到它。我知道计算机是确定性的,但所有这些都很明显,但这对我来说非常清楚,就像产生不同效果的代码行一样。

解决方案:

正如miku所说,我的用户是陈旧的。但是这个错误是在我的命令行测试中,而不是实际的模型代码。真实(和完全相同)问题的位置在视图中:

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 个答案:

答案 0 :(得分:2)

我没有对此进行测试,但似乎您的用户对象u已过时,因为您在实际更改密码之前已将其检索到。尝试

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

重置密码后它应该有效。