前言:我自學了幾年前如何使用Django,開發了一個Web應用程序,將密鑰交給了我的客戶,並且從那時起就沒有必要對應用程序做太多的事情,從那時起,我是否與Django開發了?Django身份驗證中間件一直拒絕登錄
的問題
很多用戶無法登錄成功,這似乎是對那些它影響一個長期存在的問題。然而,我不能在我的生活中弄清楚這些用戶的共同點。他們使用不同的操作系統,不同的瀏覽器,在一天/一週/一月的不同時間訪問網站。這是一個可靠的失敗,似乎並沒有遵循任何模式。
具體細節
web應用程序在Windows上,Django的1.0運行,並使用MySQL作爲數據庫。會話存儲到數據庫。
消除可能的原因
這不是一個 「錯誤的用戶名/密碼」 的問題,很遺憾。那很簡單。不,這個webapp的成千上萬的用戶使用相同的用戶名和密碼。 (不是我的偏好或選擇!)此外,身份驗證失敗不伴隨用戶名/密碼錯誤消息。
現在,網站確實適用於大多數用戶。所以我知道基本認證配置是正確的:MIDDLEWARE_CLASSES
和INSTALLED_APPS
元組包含正確的contrib行。 LOGIN_URL
,LOGIN_REDIRECT_URL
和LOGOUT_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 %}
你談論的都是,但你想念最有趣的部分: 用戶如何進行登錄?我的意思是,表單是你的或Django?視圖是你的代碼還是django?你能粘貼這段代碼的一些片段嗎?你在談論管理界面嗎? 一旦我有一個類似的問題與JavaScript錯誤:密碼發送到服務器兩次,我的意思是:passwordpassword 你使用螢火蟲或東西來查看請求的數據? – diegueus9 2010-10-30 03:57:12
該視圖是Django的,它不是管理界面。表格是我的,非常簡單。沒有使用JavaScript。不過,我已經添加了一些相關的代碼。 – nmjk 2010-10-30 23:44:20
可能用戶名和/或密碼包含非ASCII字符?如果是這樣,是否在登錄表單的HTML頭中明確指定了內容編碼,並在服務器端使用了相同的編碼來解碼錶單值? (瀏覽器通常會對HTML頁面中指定的字符集中的表單數據進行編碼。) – 2010-10-31 00:48:39