2010-10-30 26 views
2

前言:我自學了幾年前如何使用Django,開發了一個Web應用程序,將密鑰交給了我的客戶,並且從那時起就沒有必要對應用程序做太多的事情,從那時起,我是否與Django開發了?Django身份驗證中間件一直拒絕登錄

的問題

很多用戶無法登錄成功,這似乎是對那些它影響一個長期存在的問題。然而,我不能在我的生活中弄清楚這些用戶的共同點。他們使用不同的操作系統,不同的瀏覽器,在一天/一週/一月的不同時間訪問網站。這是一個可靠的失敗,似乎並沒有遵循任何模式。

具體細節

web應用程序在Windows上,Django的1.0運行,並使用MySQL作爲數據庫。會話存儲到數據庫。

消除可能的原因

這不是一個 「錯誤的用戶名/密碼」 的問題,很遺憾。那很簡單。不,這個webapp的成千上萬的用戶使用相同的用戶名和密碼。 (不是我的偏好或選擇!)此外,身份驗證失敗不伴隨用戶名/密碼錯誤消息。

現在,網站確實適用於大多數用戶。所以我知道基本認證配置是正確的:MIDDLEWARE_CLASSESINSTALLED_APPS元組包含正確的contrib行。 LOGIN_URLLOGIN_REDIRECT_URLLOGOUT_URL都設置正確。 URL調度程序工作,視圖工作等。

事實上,這對受影響的用戶來說是一致的,持續的故障,這意味着它不是負載問題。

對於一些受影響的用戶,使用不同的瀏覽器將解決該問題。對於其他人則沒有。這並不一定是一個特殊的瀏覽器配置問題,因爲很多嘗試使用第二個瀏覽器的用戶都是通過首次下載/安裝第二個瀏覽器來實現的,這大概是使用默認配置。 (請注意,用戶基本上沒有「超級用戶」。)

再現錯誤

這一切的最困難的部分是,我從未有過失敗的登錄上我的任何計算機或瀏覽器,所以解決調試過程是非常困難的。

雖然問題是可重現的。當主客戶端的計算機登錄到並使用IE 7或8時,計算機無法登錄並出現預期行爲。順便說一句:這是不是可重現當登錄到同一臺計算機,無論我使用的瀏覽器。

爲什麼我問這裏

我做了我的大部分在PHP/MySQL開發的。當我在尋找登錄問題時,我會查找用戶名/密碼,cookie,服務器端會話,瀏覽器等問題。我編寫調試代碼以將服務器/ cookie變量轉儲到屏幕等。

不幸的是我不知道如何調試Django中間件。我甚至不知道這可能是什麼類型的問題。

最後

我一直令人頭大我的大腦了好幾天。幾個月前,我經歷了同樣的事情,也是幾天之前,它被認爲比我的一些其他項目的優先級低。但現在它回來了。

我不能爲我的生活看到一種模式。我希望你們中的一些人有一些建議!

EDITED

下面是一些相關的代碼,按要求。

settings.py中

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
) 

LOGIN_URL = '/login/' 
LOGOUT_URL = '/logout/' 
LOGIN_REDIRECT_URL = '/' 

在urls.py

(r'^login/', 'django.contrib.auth.views.login', {'template_name': 'login.html'}), 
(r'^logout/', 'django.contrib.auth.views.logout', {'template_name': 'logout.html'}), 

中的login.html

{% block content %} 
<h1>Please Log In</h1> 
{% if form.errors %}<p>Your username and password didn't match. Please try again.</p>{% endif %} 
<form method="post" action="/login/"> 
<p>{{ form.username.label_tag }} {{ form.username }}</p> 
<p>{{ form.password.label_tag }} {{ form.password }}</p> 
<p><input type="submit" value="login" /></p> 
<input type="hidden" name="next" value="{{ next }}" /> 
</form> 
{% endblock %} 
+0

你談論的都是,但你想念最有趣的部分: 用戶如何進行登錄?我的意思是,表單是你的或Django?視圖是你的代碼還是django?你能粘貼這段代碼的一些片段嗎?你在談論管理界面嗎? 一旦我有一個類似的問題與JavaScript錯誤:密碼發送到服務器兩次,我的意思是:passwordpassword 你使用螢火蟲或東西來查看請求的數據? – diegueus9 2010-10-30 03:57:12

+0

該視圖是Django的,它不是管理界面。表格是我的,非常簡單。沒有使用JavaScript。不過,我已經添加了一些相關的代碼。 – nmjk 2010-10-30 23:44:20

+0

可能用戶名和/或密碼包含非ASCII字符?如果是這樣,是否在登錄表單的HTML頭中明確指定了內容編碼,並在服務器端使用了相同的編碼來解碼錶單值? (瀏覽器通常會對HTML頁面中指定的字符集中的表單數據進行編碼。) – 2010-10-31 00:48:39

回答

0

這是非常不可能的該錯誤在股票django中間件,所以你不需要調試,但你可以在你的代碼中添加一堆日誌語句,然後分析日誌。 Python logging模塊適用於此目的。

+0

我做了類似的事情。因爲我無法想象我自己的代碼中甚至有可能導致問題的任何事情,因爲我所做的只是使用@login_required裝飾器,所以我編寫了一個基本上覆制登錄信息的快速而骯髒的自定義應用程序在我自己的代碼中查看auth中間件,所以我可以用盡可能多的調試日誌來解決它。儘管如此,我已經運行了大約5天,並且沒有任何看起來可能是問題的東西。 – nmjk 2010-11-09 00:27:08

0

聲明:我不是任何方式的Django/Python專家。只需要提供一些一般性建議。

SQL服務器被掛住了嗎?也許它正在被重載,通過某種超時刪除一些登錄請求。

一切都運行在一臺服務器或多臺服務器上嗎?如果多個,它們之間可能會超時,或者某種同步問題。

+0

一切都運行在一臺服務器上,但我排除了加載問題,因爲對於無法登錄的用戶而言,他們無法登錄,無論他們何時嘗試登錄。它通常不是一個重負載的服務器......它在每個月通訊一次之後出現爆發,但除此之外,使用雖然簡單但持續。 – nmjk 2010-10-30 22:54:11