2008-10-03 73 views
1

我在Linux上通過Apache上的mod_python運行Django。我有一個自定義身份驗證後端,以及需要對所有頁面進行身份驗證的中間件,但靜態內容除外。Django,mod_python,apache和古怪的會話

我的問題是,我登錄後,我仍然會隨機獲得登錄屏幕的一次又一次。在我看來,每個apache進程都有它自己的python進程,而這個進程又擁有自己的內部進程。所以只要我通過我登錄的同一個進程獲得服務,一切都很好,並且很棒。但是如果我的請求被不同的apache進程提供服務,我不再進行身份驗證。

我檢查了我用FireBug發送的HTTP標頭,它們每次都是相同的,即。同一個cookie。

這是一個已知問題,並有解決方法/修復?

編輯:我有一個顯示大量生成圖像的頁面。有些關閉這些將不會顯示。這是因爲他們遠遠落後於身份驗證的中間件,所以他們會隨機放置一個登錄圖像。但是,刷新此頁面足夠多的時間,它最終會工作,這意味着所有進程都能識別我的會話。

+0

運行一段時間後,事情似乎更加穩定。但我不喜歡這是多麼不穩定。也許我需要重置Apache幾次,讓它運行幾分鐘,然後才能一直工作。 – Staale 2008-10-03 11:39:43

回答

0

你有標準的數據庫驅動會話嗎?緩存是否在設置中啓用?

+0

與基於標準和基於文件的會話相同的錯誤。未啓用緩存。 – Staale 2008-10-03 12:21:34

2

對於Apache如何處理這些流程是正確的,有時候您將得到不同的流程。您可以在對網站進行更改時看到此信息;新的流程將會改變,但舊的流程會給你舊的網站。爲了獲得一致性,您必須重新啓動Apache。

假設重新啓動並不能解決問題,我猜想這是在存儲器中存儲部分認證的「自定義身份驗證後端」(對於Web服務器不起作用)。我會嘗試在您的Apache配置中將MaxRequestsPerChild設置爲1,並查看您是否仍然獲得登錄屏幕。如果你這樣做,東西被存儲在內存中,也許模型沒有被保存?

希望有幫助!

P.S.出於好奇,爲什麼使用自定義身份驗證後端和中間件來確保用戶已登錄?看起來Django的contrib.auth和@login_required會更容易...

+0

我需要對活動目錄進行身份驗證,因此我自己的身份驗證後端。沒有內容存儲在內存中。我沒有使用@login_required,因爲這是針對外部可用的內部網,我不相信自己記得把它放在所有視圖上 – Staale 2008-10-03 12:23:35

0

,您需要更改此爲使用文件,數據庫或者memcached的。如上所述,mod_python啓動的進程很少,它們之間沒有共享內存。

我建議爲此使用memcached,也可以使用cookie來存儲會話ID或將它作爲GET參數傳遞,以便稍後可以輕鬆地從緩存中提取會話數據。

0

如何確保在Apache重新啓動(或停止和啓動)後會話不被清除?

因爲當我升級我的源代碼並重新啓動Apache時,我刷新了網頁,然後我必須再次登錄。會話丟失。

會話存儲在Memcache中。不知道如何以及爲何清除。如何保留會話,以便用戶在apache重新啓動後不需要登錄?