I've got a pretty simple site where I'm using the page_cache
decorator. I have a cronjob that checks for new data and processes it if it's available. (This is run using management commands executed with crontab)
I want to then clear all the page caches when new data is processed.
I'm looking at the documentation here: https://docs.djangoproject.com/en/stable/topics/cache/
and found cache.clear()
, which seems to be what I want. I've added a flag to the data processing portion and execute cache.clear()
when new data is found.
However, after the command runs the cache isn't cleared. (I've cleared the browser cached and checked to be sure it's not the browser)
Does cache.clear()
not work in to clear all cached pages?
I'm using the DatabaseCache
, so I guess I could go in and clear the cache table manually, but is there a better way?
After the use of the cache, cache_clear() can be used for clearing or invalidating the cache. These methods have limitations as they are individualized, and the cache_clear() function must be typed out for each and every LRU Cache utilizing the function.
Django stated in their docs that all query sets are automatically cached, https://docs.djangoproject.com/en/dev/topics/db/queries/#caching-and-querysets.
Local Memory Cache Unless we explicitly specify another caching method in our settings file, Django defaults to local memory caching. As its name implies, this method stores cached data in RAM on the machine where Django is running. Local memory caching is fast, responsive, and thread-safe.
I've had this problem with an SQLite database cache - the clear()
method doesn't clear the cache although it works fine with a MySQL database cache. It seems that a SQLite cache needs a call to django.db.transation.commit_unless_managed()
after the DELETE from [table]
statement is run.
I have been using multiple caches since before official support was added into core as part of 1.3 and so have a wrapper round several of the cache calls - including clear()
- so I was able to override this method and include the commit_unless_managed()
. I think I should probably log it as a bug.
Here's the outline of the code I'm using to flush a memcache cache (the default cache in django.core.cache
) and a database cache stored in the cache_table
of the settings.DATABASES['cache_database']
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')
Rather than being lazy and hard coding it the way I have it should be pretty easy to get the values from settings.CACHES
and django.db.router
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With