我正在尝试清除使用信号保存的一个特定条目的缓存。
我正在使用来自 django-annoying
的装饰器(signals
和 render_to
)
@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'
},
}
和 View :
@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])
session :
LANGUAGE_CODE = 'pt-BR'
LANGUAGES = (
('pt-BR','Portugues'),
)
- 我只有在重新启动 Gevent 服务器时才会更新内容。
最佳答案
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')
您是否尝试过使用另一个缓存后端?看来您所做的一切都是正确的。
也许错误出在后端,某些配置不会让它覆盖 key 或其他奇怪的东西..
关于python - 无法删除 Django 中特定条目的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12574422/