Cómo borrar todo el caché al usar el decorador page_cache de django

Tengo un sitio bastante simple donde estoy usando el decorador page_cache . Tengo un cronjob que busca nuevos datos y los procesa si están disponibles. (Esto se ejecuta utilizando comandos de administración ejecutados con crontab)

Luego quiero borrar todos los cachés de la página cuando se procesan nuevos datos.

Estoy viendo la documentación aquí: https://docs.djangoproject.com/en/dev/topics/cache/?from=olddocs?from=olddocs

y encontré cache.clear() , que parece ser lo que quiero. cache.clear() un indicador a la parte de procesamiento de datos y cache.clear() cuando se encuentran nuevos datos.

Sin embargo, después de que se ejecuta el comando, el caché no se borra. (He borrado el navegador en caché y he comprobado que no sea el navegador)

¿ cache.clear() no funciona para borrar todas las páginas en caché?

Estoy usando DatabaseCache , así que supongo que podría entrar y borrar la tabla de la memoria caché manualmente, pero ¿hay alguna forma mejor?

He tenido este problema con un caché de base de datos SQLite: el método clear() no borra el caché, aunque funciona bien con un caché de base de datos MySQL. Parece que un caché de SQLite necesita una llamada a django.db.transation.commit_unless_managed() después de ejecutar la instrucción DELETE from [table] .

He estado usando múltiples cachés desde antes de que se agregara el soporte oficial en el núcleo como parte de 1.3, por lo que tengo una envoltura alrededor de varias de las llamadas al caché, incluido clear() , así que pude invalidar este método e incluir el commit_unless_managed() . Creo que probablemente debería registrarlo como un error.

Aquí está el esquema del código que estoy usando para vaciar un caché de memcache (el caché predeterminado en django.core.cache ) y un caché de base de datos almacenado en la cache_table de cache_table de la settings.DATABASES['cache_database'] base de datos de settings.DATABASES['cache_database'] .

 from django.db import connections, transaction from django.core.cache import cache # This is the memcache cache. def flush(): # This works as advertised on the memcached cache: cache.clear() # This manually purges the SQLite cache: cursor = connections['cache_database'].cursor() cursor.execute('DELETE FROM cache_table') transaction.commit_unless_managed(using='cache_database') 

En lugar de ser un código vago y difícil de la forma en que lo tengo, debería ser bastante fácil obtener los valores de settings.CACHES y django.db.router .

Es un error # 19896 que parece ser corregido en 1.6.

Si está utilizando una versión anterior, hacer algo como lo siguiente debería hacer que el trabajo funcione como se esperaba.

 from django.db import router, transaction def clear_cache(the_cache): the_cache.clear() # commit the transaction db = router.db_for_write(the_cache.cache_model_class) transaction.commit_unless_managed(using=db) 

Esto solo se asegura de que la transacción se comprometa.

Ponga algo en la memoria caché, luego intente llamar a cache.clear() desde la consola manage.py shell y luego verifique manualmente el contenido de la memoria caché de la base de datos. Si eso funciona, quizás no se cache.clear() cuando se encuentren nuevos datos.

La forma más fácil de entender lo que sucede debajo del capó es poner import pdb; pdb.set_trace() import pdb; pdb.set_trace() al principio de la función cache.clear() , luego ejecute el servidor de depuración y espere, luego, un código llama a esta función, podrá ejecutar paso a paso su código o simplemente verá que esta función no se llama como se espera.