Posted on 2012-09-18 00:30:00+00:00
Caching in Django is elegant and simple, especially the site-wide cache for anonymous users. But if you use Google Analytics and other external cookies, it might not be working the way you intended. Read this tutorial to find out how to make your site as fast as it can be.
By enabling the site-wide cache in Django, you probably intended for pages every page to be cached for every anonymous users. That's the point, at least. The problem is, the page cache is set to Vary: Cookie
. That means that if you have a session cookie or anything of the like, the cache will be different for each user.
Fortunately, that's not a problem with Django itself, since anonymous users won't have cookies set. But it is a problem if you're using Google Analytics. That's because Google Analytics sets cookies that trigger the site-wide cache's Vary: Cookie
condition. Luckily, fixing this is as easy as using a small piece of middleware and a touch of inheritance.
Let's create a new middleware file, call it middleware.py
and place it in your project root. Add the following snippet to the file1:
1 2 3 4 5 6 7 8 9 10 11 |
|
So what does this do? It replaces the middleware that comes with Django. Before passing on the cookies to the rest of the application, it strips out the cookies set by Google Analytics. That way, the Vary: Cookie
condition won't be triggered, as your application won't see any of these cookies. To deploy these changes, simply find your middleware classes in settings.py, and replace django.middleware.cache.UpdateCacheMiddleware
with middleware.SmartUpdateCacheMiddleware
. Your middleware settings should look like so:
1 2 3 4 5 |
|
And that's it. You're done.
Many thanks to the people over at http://djangosnippets.org/snippets/1772/ for the middleware. ↩
This was written for Django 1.2. I believe Django changed its middleware structure around Django 1.10, so I'm not sure when this stopped working. The concepts might still apply though.