32
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
.
6
Itโs a bug #19896 that looks to be fixed in 1.6.
If you are using an older version doing something like the following should make the clear work as expected.
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)
This just makes sure that the transaction gets committed.
- [Django]-ImportError: cannot import name 'url' from 'django.conf.urls' after upgrading to Django 4.0
- [Django]-Define css class in django Forms
- [Django]-How to add clickable links to a field in Django admin?
4
Put something into cache, then try to call cache.clear()
from the manage.py shell
console and then manually check database cache contents. If that works then maybe your cache.clear()
is just not called when new data is found.
The easiest way to understand what is going under the hood is just to put import pdb; pdb.set_trace()
to the beginning of the cache.clear()
function, then run debug server and wait, then some code call this func youโll be able to execute step-by-step its code or youโll just see that this func is not called as your expected.
- [Django]-Django: Can I create a QueryDict from a dictionary?
- [Django]-Django โ How to make a variable available to all templates?
- [Django]-How to customize activate_url on django-allauth?
0
You can clear cache (delete all cache values) with a custom command. *I use LocMemCache which is used by default in Django:
For example, create clearcache.py
in core/management/commands/
as shown below. *Donโt forget to put __init__.py
to management
and commands
folders and the doc explains how to create a custom command in Django:
django-project
|-core
| |-settings.py
| โ-management
| |-__init__.py
| โ-commands
| |-__init__.py
| โ-clearcache.py # Here
|-my_app1
โ-my_app2
Because you put clearcache.py
in core
folder where settings.py
is so you need to set 'core'
to INSTALLED_APPS otherwise the custom command is not recognized by Django:
# "core/settings.py"
INSTALLED_APPS = [
...
'core', # Here
...
]
Then, create Command
class extending BaseCommand class in core/management/commands/clearcache.py
as shown below:
# "core/management/commands/clearcache.py"
from django.core.management.base import BaseCommand
from django.core.cache import cache
class Command(BaseCommand):
def handle(self, *args, **kwargs):
cache.clear()
self.stdout.write('Cache is cleared\n')
Finally, running the command below can clear cache:
$ python manage.py clearcache
Cache is cleared
- [Django]-Django: Catching Integrity Error and showing a customized message using template
- [Django]-Django โ query filter on manytomany is empty
- [Django]-Query datetime by today's date in Django