2009-10-27 19 views
9

我已經Django的Apache中通過mod_wsgi的運行。我相信Django緩存服務器端的頁面,這導致一些功能無法正常工作。如何禁用的Django/mod_wsgi的頁面緩存

我有一個倒數計時器,通過獲取當前服務器時間,確定剩餘的倒計時時間,並將該數字輸出到HTML模板。一個javascript倒數計時器接管併爲用戶運行倒計時。

當用戶刷新頁面或使用倒數計時器導航到不同頁面時,會出現問題。計時器似乎偶爾會跳到不同的時間,通常會在每次刷新時反覆回到同一時間。

使用HTTPFox,頁面沒有從我的瀏覽器緩存中加載,所以它看起來像是Django或Apache正在緩存頁面。有什麼辦法可以禁用這個功能嗎?我不會有足夠的流量來擔心緩存腳本輸出。或者我完全錯誤地解釋爲什麼會發生這種情況?

[編輯]從下面的帖子看,Django中禁用了緩存,這意味着它必須發生在其他地方,也許在Apache?

[編輯]我對發生的事情有了更全面的描述:對於服務器發出的前7個請求,頁面由腳本呈現並返回,儘管這7個頁面中的每一個似乎都隨着它稍後顯示被緩存。在第8個請求中,服務器提供第一頁。在第9個請求中,它在一個循環中提供第二個頁面,等等。這個過程一直持續到我重新啓動apache,當這個過程重新開始時。

[編輯]我已經配置mod_wsgi一次只運行一個進程,這導致計時器在每種情況下都重置爲相同的值。有趣的是,我的頁面上還有另一個組件,它使用order('?')在每個請求上顯示隨機圖像,並且每次都會用不同的圖像進行刷新,這表明緩存正在Django而不是Apache中進行。

[編輯]考慮到之前的編輯,我回去查看了相關的views.py文件,發現倒計時開始變量在模塊中全局設置,在視圖函數之外。在視圖函數中移動該設置解決了問題。所以事實證明,畢竟這不是一個緩存問題。感謝大家在這方面的幫助。

+0

http://www.djangobook.com/en/2.0/chapter15/ – cwallenpoole 2009-10-27 21:20:59

回答

6

從我的Apache中的mod_wsgi的經驗,這是極不可能的,他們所造成的緩存。幾件事情嘗試:

  1. 這可能是你有你的計算機和適當或不適當緩存頁面的Web服務器之間的一些proxy server。有時ISP運行代理服務器以減少網絡外的帶寬。你能否爲緩存的頁面提供HTTP頭文件(Firebug可以給你這些)。我特別感興趣的頭包括Cache-Control,Expires,Last-Modified和ETag。
  2. 你可以從你的settings.py文件中發佈你的MIDDLEWARE_CLASSES。有可能你有一個爲你執行緩存的中間件。
  3. 你可以grep你的代碼的下列項目「加載緩存」,「django.core.cache」,和「cache_page」。 * grep -R「搜索」**將起作用。
  4. settings.py(或其導入的任何東西「from localsettings import *」)是否包含CACHE_BACKEND?
  5. 當你重新啓動Apache時會發生什麼? (例如,sudo服務apache重新啓動)。如果重新啓動清除問題,那麼它可能會做的apache緩存(這是可能的,這也明確了locmen Django的緩存後端)
+0

我同意。這可能是Apache或您的ISP進行緩存。 – 2009-10-28 02:31:41

+0

1.該站點當前正在本地網絡的服務器上運行,因此沒有代理服務器。 2. MIDDLEWARE_CLASSES =( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ) 3.無的這些術語出現在代碼中的任何地方。 4.否 5.重新啓動Apache會清除問題並以新值刷新緩存 – Travis 2009-10-28 17:28:35

1

你有沒有專門設置Django的緩存?從文檔看,你會清楚地知道Django是否緩存,因爲它需要事先做好工作才能正常工作。具體來說,您需要定義緩存文件的保存位置。

http://docs.djangoproject.com/en/dev/topics/cache/

+0

我沒有做任何這初步的工作,所以我想Django緩存是禁用的...任何想法還有什麼可能導致定時器開始時間被緩存的問題? mod_wsgi可以做apache嗎? – Travis 2009-10-27 21:39:00

1

您正在使用的Apache/mod_wsgi的多進程的配置?如果是,那麼這將解釋爲什麼不同的響應可能具有不同的定時器值,因爲當定時器初始化時,每個處理請求可能會有所不同。因此爲什麼它可以跳轉。

有讀:在什麼模式或配置您正在運行Apache/mod_wsgi的,也許張貼配置是什麼

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

鍛鍊。不知道,有太多的未知數。

+0

httpd -V顯示正在使用Prefork MPM。線程:否,分叉:是(可變進程計數) – Travis 2009-10-28 17:48:04

+0

然後單獨的請求可以由不同的進程處理,因此這些進程可能有不同的數據視圖。另請閱讀'http://blog.dscpl.com.au/2009/03/load-spikes-and-excessive-memory-usage.html',瞭解使用mod_python和mod_wsgi的prefork的危險。 – 2009-10-28 21:09:43

+0

這似乎是發生了什麼事。我將配置更改爲在「守護程序」模式下運行,將進程數量限制爲1,該進程將其限制爲只有一個緩存版本的頁面。所以我的計時器在每個請求上重置爲相同的值。不幸的是,這仍然不是所期望的行爲。 – Travis 2009-10-28 21:44:05

2

我只是碰到這樣的:

支持自動重新加載爲了幫助您能 激活自動重新加載支持部署工具。無論什麼時候改變.wsgi文件,mod_wsgi都會爲我們重新加載所有的守護進程。

對於這一點,只需添加下面的指令到你的目錄部分:

WSGIScriptReloading On 
+1

默認情況下,您不必擔心。在http://code.google。中描述瞭如何處理重新加載。com/p/modwsgi/wiki/ReloadingSourceCode – 2013-05-25 21:54:20

+2

我不知道 - 但我可以說我一直在兩臺不同的機器上使用wsgi,一臺是基於Django的複雜網站(OpenStack Dashboard/Horizo​​n),另一臺是我的擁有更簡單的腳本 - 每次啓用WSGIScriptReloading時,都會在修改腳本時發生這種情況 - 修改將在下一頁重新加載時生效,而無需重新啓動Apache。 – Brad 2013-05-26 01:53:40

+1

嗯,我可以說我寫了mod_wsgi,並且代碼在默認情況下啓用了它。正如我在文檔I中所解釋的那樣,對於嵌入式模式WSGI腳本文件本身被重新加載而不是所有的應用程序代碼。您應該仔細檢查您是否實際上使用了該文檔描述的嵌入模式或守護進程模式。通常人們沒有WSGIProcessGroup指令,並且沒有像他們認爲的那樣使用守護進程模式。 – 2013-05-27 01:15:26