为什么我的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
,因为在 _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)
重置密码之后再使用它,这样应该就能正常工作了。