Подтвердить что ты не робот

Невозможно удалить кеш для конкретной записи в 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.
4b9b3361

Ответ 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')

И попробовали ли вы с другим кэшированием? Похоже, все, что вы делаете, правильно.

Может быть, ошибка в бэкэнд, какая-то конфигурация, которая не позволит ей перезаписывать ключи или что-то странное.