2012-02-08 162 views
4

我真的很想念這裏發生了什麼。 Django 1.3。Django驗證失敗

症狀:身份驗證被簡單地破壞。我已經減少了這個問題:

./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 

編輯三:

麥金太爾是正確的 - 謝謝你。

>>> 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

Django的什麼版本? – 2012-02-08 19:47:09

+0

我正在運行1.3。 – jal 2012-02-08 19:48:51

+0

既然您已設法設置密碼並將其正確保存,那麼Django管理員登錄名是否可以使用您的新密碼? – Alasdair 2012-02-08 19:49:39

回答

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',) 

如果你已經將它設置爲別的東西,這可能會導致問題。

+0

糟糕,對不起,格式問題。 '用戶'的回覆是[]。是的,密碼爲「無論」的用戶是'jal'。我做得很新鮮,並且它是這個數據庫中唯一的用戶。 – jal 2012-02-08 19:15:36

+0

啊,我現在已經修復了格式。你不需要'pre'塊 - 只需要爲代碼塊縮進4個空格。 – Alasdair 2012-02-08 19:19:16

+0

作爲迴應,AUTHENTICATION_BACKENDS =( 'django.contrib.auth.backends.ModelBackend', )另外,感謝格式化提示。 – jal 2012-02-08 19:22:16

1

您是否檢查使用是否有效? (User.is_active)

不活動的用戶沒有權限而無法登錄(除非你自定義的東西)