2011-06-01 21 views
0

我想登錄在用下面的代碼一個用戶:Django的登錄拋出一個「<類型‘exceptions.AttributeError’>」異常

try: 
       user = User.objects.get(username = username) 
       print "user found" 

       if user.password == password and user.is_active: 
        print "user: " + str(user) 
        try: 
         print "test1" 
         login(request, user) 
         print "test2" 
        except: 
         print "error" 
         import sys 
         print "--> " + str(sys.exc_info()[0]) 
         raise 
        user_is_valid = True 
        print "hell yeah!!" 
      except: 
       user = None 
       print "failed" 

與活動用戶登錄時什麼給出以下控制檯輸出:

user found 
user: [email protected] 
test1 
error 
--> <type 'exceptions.AttributeError'> 
failed 

用戶名是電子郵件地址,但我看不出有什麼問題。用戶處於活動狀態,您可以看到用戶對象不是無。爲什麼登錄方法拋出壞的屬性異常,我該如何解決這個問題?

+0

請打印異常的文本表示和回溯。回溯模塊應該可以幫助你做到這一點。 – 2011-06-01 10:17:11

回答

2

你爲什麼要這樣做?首先,你不應該只是爲了重新提高它而捕捉異常。在DEBUG上運行時,Django爲您提供了一個極好的錯誤頁面,它將向您顯示實際的錯誤和引發錯誤的代碼 - 尤其是,您會看到正在訪問哪個屬性。

最有可能的是,錯誤是你沒有在用戶上調用authenticate,而且在檢查密碼的同時還添加了一個屬性,記錄哪個驗證後端驗證了該用戶。 documentation on how to log a user in非常清楚,您需要調用此方法 - 請注意表示「首先調用authenticate」的方框。

你絕對不應該做的第三件事是將密碼作爲文本檢查 - Django將它們存儲爲散列值,因此您需要比較散列值。再次,authenticate將照顧這個給你。

+0

您是如何在首位創建用戶(特別是密碼)的?正如我所提到的,Django將密碼存儲爲哈希值,這就是爲什麼如果您以編程方式執行該操作,您應該始終執行'User.objects.create_user(用戶名,電子郵件,密碼)'。這聽起來像你剛剛創建了用戶,並將密碼存儲爲文本,這就是爲什麼當你原來的比較不應該是原來的比較工作。 – 2011-06-01 10:28:28

+0

因爲我是Django的新手:P感謝您的幫助..問題出在用戶的密碼上。我在管理面板中手動添加了它,所以不會被散列。 – 2011-06-01 10:32:54

相關問題