2011-05-28 526 views
3

我試圖在Django中編寫一個簡單的應用程序來緩存一些外部圖像,並根據請求顯示/刷新它們。Django模板緩存刷新問題

我要做的就是:
{% load cache %} {% cache 1500 image %} {% endcache %}

並刷新這是否在視圖代碼上點擊刷新「按鈕」的時候:
key = "template.cache.image.d41d8cd98f00b204e9800998ecf8427e" cache.delete(key)

現在,當圖像被刪除的作品全部罰款,我更換src有一些不同的價值。當我在{% cache ... %} {% endcache %}標籤中鍵入內容時,它也可以工作,但是當圖像發生變化時(比如我用另一個圖像替換它),刷新按鈕不會產生任何效果,直到使用瀏覽器的刷新按鈕(或使用F5)刷新整個頁面。我在Chrome(某些版本)和Opera(11)上測試過它。我的觀點並沒有使用任何緩存選項,但我嘗試了@never_cache和一些其他標籤,沒有任何幫助。

我希望你能幫助我。


此致敬禮。

編輯:我正在嘗試做的是緩存圖像並根據請求刷新它。也許它需要一些Python工作來獲取圖像,緩存響應哈希,然後重新緩存圖像(通過刪除它,如果它以前的哈希更改),但我不知道如何通過python HttpResponse/render_to_response發送圖像到「 HTML表單「來顯示它。

+0

當你說你不知道如何通過python發送圖像時,你是否想要發送URL或二進制對象,然後將其顯示在頁面上?看到你現在擁有的示例代碼,將會更容易幫助你。 – 2011-05-28 16:55:30

回答

2

你是否保持相同的圖像名稱,但更改圖像?我猜測這是導致你問題的瀏覽器緩存而不是django緩存。

嘗試添加一個查詢字符串到圖像的末尾,它應該有助於使瀏覽器緩存無效。這不要緊,你放什麼在他們的查詢字符串,它只是需要是唯一

<img src="/image.jpg?cachebuster=blah23" />

+0

它沒有幫助。抱歉。 = < – user767849 2011-05-28 14:44:47

+0

我測試了它在本地文件上。關鍵是緩存外部資源。你的想法可能只適用於本地資源。 – user767849 2011-05-28 15:11:22

+0

@ user767849我不確定爲什麼它不適用於外部資源?你能發佈你用來顯示圖像的代碼嗎?你有上面的代碼片斷,但看到所有的模板代碼都會很好。 – 2011-05-28 16:06:47

3

肯的回答爲我工作。

如果您使用的Django,在模板中,就使用類似

<img src="/image.jpg?cachebuster={{uuid}}" /> 

,並通過從服務器端的uuid。

我想投票贊成肯的答案,但不幸的是我沒有足夠的聲望來這樣做。對不起,我必須再次回答這個問題。

0

我有瀏覽器緩存刷新問題,Ken Cochrane的回答讓我想到了一個解決方案。

我的問題是模型的詳細信息頁面。在更新記錄後,回到詳細信息頁面,瀏覽器顯示了哪些內容處於無效狀態 - 沒有更新的頁面。這吸了很大的時間!想象一下,在保存一些更新後用戶的困惑,僅僅是從(瀏覽器緩存版本的)詳細信息頁面誤解了更新沒有保存!但他們被保存了,問題是瀏覽器顯示緩存版本。

肯科克倫的解決方案:添加一個查詢字符串與東西獨特。這對我有效!起初,我只是添加了timezone.now()格式爲URL兼容,如?utc = 2018-02-19_22.57.30(在URL中,冒號繼續端口,冒號混淆URL - 不能使用冒號)。

蟒蛇格式字符串:「%Y-%間%D_%H.%M.%S」

這解決了我的問題,但是這是每次強制刷新用戶重出江湖詳細視圖頁面,即使沒有更新。然後它發生在我身上:不是使用timezone.now(),而是使用模型行的上次更新時間戳。更新後,最後一次更新時間戳會晚於先前更新時間戳,因此瀏覽器將刷新。如果用戶沒有任何更新而再次返回,則最後更新時間戳將相同,因此瀏覽器可以顯示緩存頁面。

所以我的查詢字符串?更新= 2018-02-19_22.57.30

保持相同的圖像名稱,但通過使用圖像文件的文件系統的時間戳改變圖像文件時,該解決方案可用於查詢字符串。只有當圖像改變時,時間戳纔會不同,瀏覽器將刷新。當圖像文件相同時,時間戳將相同,因此瀏覽器可以顯示緩存版本。