2012-05-28 67 views
4

以前,我在我的Django模板中設置了一個緩存的HTML塊,如下所示。如何在Django中刪除緩存的模板片段?

{% load cache %}    
    {% cache 10000 courseTable %} <!-- Cached HTML --> {% endcache %} 

現在,我已經更新了這個緩存的內容,並且想刷新它。我嘗試更改時間無濟於事:

{% load cache %}    
    {% cache 0 courseTable %} <!-- Updated Cached HTML --> {% endcache %} 

在這種情況下,頁面仍顯示舊的緩存HTML。

我也嘗試刪除與緩存相關聯的模板標籤並將它們重新插入。但是,在這種情況下,在我重新插入緩存模板標記後,內容僅恢復爲最初緩存的內容。

我該怎麼辦?我不想等待大約2個小時來重新加載緩存。

+0

也許......清空緩存? –

+0

等一下,我可以用python-memcache做到這一點? – dangerChihuahua007

+0

如何清空緩存?我可以承受完全清空Memcache。 – dangerChihuahua007

回答

7

如果你能買得起空完全memcached的,運行CMD flush_all或者乾脆

from django.core.cache import cache 
cache.clear() 

否則你必須generate the cache-key manually。直到密鑰過期,timeout纔會刷新。

2

在Django 1.6之前,cache模板標籤或多或少地在標籤定義的主體中構建了緩存鍵(請參閱here)。從1.6開始,使用django.core.cache.utils.make_template_fragment_key函數(參見here)構建了模板碎片緩存鍵。

在任何情況下,你可以通過使用或定義make_template_fragment_key刪除特定的緩存片段,以獲取其緩存鍵,像這樣:

from __future__ import unicode_literals 

import hashlib 
from django.core.cache import cache 
from django.utils.encoding import force_bytes 
from django.utils.http import urlquote 

TEMPLATE_FRAGMENT_KEY_TEMPLATE = 'template.cache.%s.%s' 


def make_template_fragment_key(fragment_name, vary_on=None): 
    if vary_on is None: 
     vary_on =() 
    key = ':'.join(urlquote(var) for var in vary_on) 
    args = hashlib.md5(force_bytes(key)) 
    return TEMPLATE_FRAGMENT_KEY_TEMPLATE % (fragment_name, args.hexdigest()) 


def delete_cached_fragment(fragment_name, *args): 
    cache.delete(make_template_fragment_key(fragment_name, args or None)) 


delete_cached_fragment('my_fragment', 'other', 'vary', 'args') 

此代碼是直接從Django的代碼庫複製這樣this許可和版權適用。

3

Django的1.6+從Django Documentation你可以只產生局部的您正在尋找的鑰匙,並將其刪除:

from django.core.cache import cache 
from django.core.cache.utils import make_template_fragment_key 

cache key for {% cache 500 sidebar username %} 
key = make_template_fragment_key('sidebar', [username]) 
cache.delete(key) # invalidates cached template fragment 

你只需要調用make_template_fragment_key與先前定義的courseTable說法。