2012-09-24 12 views
13

Estoy tratando de purgar el caché para una entrada específica cuando se guarda mediante señales.No se puede borrar el caché para una entrada específica en Django

estoy usando decoradores (signals y render_to) de 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) 
  • El problema es que al guardar el modelo, recibo de salida "notfound key", por lo que el caché de purga continúa sin
  • request.path están apuntando correctamente a mi ruta de entrada.

Algunos ajustes:

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' 
    }, 
} 

Y la vista:

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

Gracias.

EDIT:
lo hice Ilvar cambios y ahora me estoy haciendo "found key" como el retorno, pero todavía no se puede borrar la memoria caché:

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'), 
) 
  • Solo tengo el contenido actualizado cuando reinicio Gevent Server.
+0

De alguna manera el valor de su valor calculado de 'key' debe ser diferente que el valor de la CacheMiddleware. Intentaría observar los valores de 'cache_key' en' django/middleware/cache.py' 'FetchFromCacheMiddleware' y' UpdateCacheMiddleware' utilizando un depurador o instrucciones de impresión. – user27478

+2

Solo para comprobar si el problema será reproducible, intente reemplazar el motor de almacenamiento en caché por algo así como memcached o redis. – alecxe

+0

Si está utilizando configuraciones regionales, get_cache_key también usa el código de idioma para compilar la clave de caché, agréguelo a su código → request.LANGUAGE_CODE = settings.LANGUAGE_CODE –

Respuesta

2

cache.set (clave, Ninguno, 0) debería ser suficiente, he estado borrando claves de caché de esa manera antes.

Si puede, ¿puede probar el cache.clear() para borrarlo todo? Solo para ver si funciona.

¿No se pueden eliminar algunas de las claves de la memoria caché? ¿El resultado de esto es el esperado?

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') 

¿Y ha intentado con otro backend de almacenamiento en caché? Parece que todo lo que estás haciendo es correcto.

Tal vez el error está en el back-end, alguna configuración que no va dejar que se sobrescribe llaves o algo raro ..

Cuestiones relacionadas