2012-09-24 58 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') 

你有没有尝试与另一个缓存后端?看起来你所做的一切都是正确的。

也许错误是在后端,一些配置是不会让它覆盖键或奇怪的东西..