为什么我的Django密码更改没有生效?

0 投票
1 回答
1222 浏览
提问于 2025-04-16 13:22

我有一个用户资料模型,用来补充内置的用户模型。我写了一个函数,用来重置用户的密码,代码如下:

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,因为在 _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 个回答

2

我没有测试过这个,不过看起来你的用户对象 u 可能过时了,因为你在实际更改密码之前就取出了它。试着在

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

重置密码之后再使用它,这样应该就能正常工作了。

撰写回答