Nasty surprise of Django cache
09 December 2008
Caching in Django absolutely rocks. Much so because of its simplicity which lowers the threshold to the height of a snowflake. However the simplicity can cause some unexpected surprises.
I ran my site and clicked around until I found a bug I wanted to fix. Then I wrote the test and ran the testrunner but I was getting some really weird behavior. The view looked like this:
@never_cache def club_page(request, clubname): club = _find_club(clubname) if club is None: raise Http404('Could not find the club') classes = cache.get('club_page_classes') if classes is None: classes = ClubClass.objects.filter(club=club).order_by('start_time') cache.set('club_page_classes', classes, CACHE_TIMEOUT) ...
What happened (and what took me a while to figure out) was that the memcache was still active and being used when running the tests since it's only within the hour that I started running the tests with completely different data. Here's how I solved the problem:
class ViewsTestCase(unittest.TestCase): ... def test_club_page(self): """ test rendering the club page """ cache.delete('club_page_classes') ...
There must be an easier way to patch the testrunner to reset all cache before running the tests. Anybody?