2012-09-24 60 views
13

我試圖在使用信號保存時清除某個特定條目的緩存。無法刪除Django中特定條目的緩存

我使用的裝飾(signalsrender_to)從django-annoying

@signals.post_save(sender=Artigo) 
def artigo_post_save(instance, **kwargs): 

    from django.http import HttpRequest 
    from django.utils.cache import get_cache_key 
    from django.core.cache import cache 

    # cache.delete(instance.get_absolute_url()) # not work 

    request = HttpRequest() 
    request.method = "GET" 
    request.path = '/' + instance.get_absolute_url() 

    print 'request path: ', request.path 

    key = get_cache_key(request=request, 
         key_prefix=settings.CACHE_MIDDLEWARE_KEY_PREFIX) 

    print "found key" if cache.has_key(key) else "notfound key" 

    if cache.has_key(key): 
     cache.delete(key) 
     cache.set(key, None, 0) 
  • 的問題是,當我保存模型,我得到的輸出"notfound key",所以緩存繼續而不清洗
  • request.path正確地指向我的入口路徑。

一些設置:

SESSION_ENGINE = "django.contrib.sessions.backends.cache" 
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True 
CACHE_MIDDLEWARE_KEY_PREFIX = 'cache' 
CACHE_MIDDLEWARE_SECONDS = 600 

CACHES = { 
    'default': { 
      'LOCATION': '', 
      'BACKEND': 'django.core.cache.backends.locmem.LocMemCache' 
    }, 
} 

和視圖:

@cache_page(60 * 60) 
@render_to('artigo.html') 
def artigo(request, categoria_slug, extra_slug="", artigo_slug=""): 
    ... 

謝謝。

編輯:
我做Ilvar變化,現在我越來越"found key"作爲回報,但我仍然無法刪除緩存:

key = _generate_cache_header_key(key_prefix=settings.CACHE_MIDDLEWARE_KEY_PREFIX, request=request) 
    key = key.replace(settings.LANGUAGE_CODE, settings.LANGUAGES[0][0]) 

CONF:

LANGUAGE_CODE = 'pt-BR' 

LANGUAGES = (
     ('pt-BR','Portugues'), 
) 
  • 我重新啓動Gevent Server時只更新了內容。
+0

不知何故key'的'你的計算值值必須大於從CacheMiddleware的值不同。我會嘗試使用調試器或打印語句在'django/middleware/cache.py'' FetchFromCacheMiddleware'和'UpdateCacheMiddleware'中觀察'cache_key'的值。 – user27478

+2

只是爲了檢查問題是否可以重現,請嘗試將緩存引擎替換爲memcached或redis。 – alecxe

+0

如果您使用語言環境,則get_cache_key還使用語言代碼構建緩存鍵,將其添加到您的代碼中→request.LANGUAGE_CODE = settings.LANGUAGE_CODE –

回答

2

cache.set(key,None,0)應該足夠了,我一直在清除緩存鍵。

如果可以,您可以嘗試使用cache.clear()來清除所有內容嗎?只是爲了看看它是否有效。

您的緩存鍵是否可刪除?這是否如預期的那樣?

cache.set('testkey', 'testvalue', 600) 
cache.get('testkey') 
cache.delete('testkey') 
cache.get('testkey') 
cache.set('testkey', 'testvalue2', 600) 
cache.set('testkey', 'another value', 600) 
cache.get('testkey') 

你有沒有嘗試與另一個緩存後端?看起來你所做的一切都是正確的。

也許錯誤是在後端,一些配置是不會讓它覆蓋鍵或奇怪的東西..