Невозможно удалить кеш для конкретной записи в Django
Я пытаюсь очистить кеш для одной конкретной записи, когда она сохраняется с помощью сигналов.
Я использую декораторы (signals
и render_to
) из django-annoying
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'
},
}
И мнение:
@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.
Ответы
Ответ 1
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')
И попробовали ли вы с другим кэшированием? Похоже, все, что вы делаете, правильно.
Может быть, ошибка в бэкэнд, какая-то конфигурация, которая не позволит ей перезаписывать ключи или что-то странное.