我真的很想念这里发生的事情。 Django 1.3。
症状:身份验证简单地被破坏。我把问题减少到了这个:
./manage.py shell
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>from django.contrib.auth.models import User
>>> users = User.objects.all()
>>> users
[<User: jal>]
>>> users[0].set_password('whatever');
>>> users[0].save()
>>> user = auth.authenticate(username="jal", password="whatever")
>>> print user
None
我对此感到茫然。
编辑:
>>> from django.contrib.auth.models import User
>>> user = User.objects.get(username="jal")
>>> print user
jal
>>> user.check_password('whatever')
False
我正在使用django.contrib.auth.backends.ModelBackend。
编辑二:
>>> print user
jal
>>> print user.is_active
True
编辑三:
Alasdair是对的 - 谢谢。
>>> users = User.objects.all()
>>> user = users[0]
>>> user.set_password('whatever')
>>> user.save()
>>> u2 = auth.authenticate(username="jal", password="whatever")
>>> print u2
jal
这仍然为实际访问Django管理GUI而破坏了原因,这就是为什么我首先要走这条路。它给了我“请输入正确的用户名和密码。请注意,无论密码是否正确,这两个字段都区分大小写。”
答案 0 :(得分:4)
您遇到此问题是因为Django querysets are lazy。每次访问users[0]
时,Django都会返回一个不同的对象。
为了证明这一点,请尝试以下方法:
>>> users = User.objects.all()
>>> print id(users[0])
58753692
>>> print id(users[0])
58753111
您可以看到每次对象ID都不同。您保存的对象与您为其设置密码的对象不同。新密码尚未保存到数据库,因此身份验证失败。
要解决此问题,您可以将用户[0]分配给变量,或者用户list()
强制对查询集进行评估。
# Assign users[0] to a variable.
users = User.objects.all()
user = users[0]
user.set_password('whatever')
user.save()
# Force the queryset to be evaluated by using list()
users = list(User.objects.all())
users[0].set_password('whatever')
users[0].save()
修改:此建议不是问题,但可能有助于其他人。
设置文件中AUTHENTICATION_BACKENDS
的值是多少?您无需在settings.py
中对其进行定义,因为它默认为:
AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', )
如果您将其设置为其他内容,则可能会导致问题。
答案 1 :(得分:1)
您是否检查过该用途是否有效? (User.is_active)
非活动用户没有权限且无法登录(除非您自定义内容)