我有一个用于补充内置用户模型的配置文件模型。我已经创建了一个重置用户密码的功能,如下所示:
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
答案 0 :(得分:2)
我没有对此进行测试,但似乎您的用户对象u
已过时,因为您在实际更改密码之前已将其检索到。尝试
u = User.objects.get(profile = p)
重置密码后它应该有效。