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.
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
Solo para comprobar si el problema será reproducible, intente reemplazar el motor de almacenamiento en caché por algo así como memcached o redis. – alecxe
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 –