The Django cache middleware is great, but has one drawback. If you are caching views (which can give a nice performance boost) Django will only use the path segment of the URL to create a cache key. If you are an avid reader of RFC 3986 you may remember that a URI consists of multiple components; path and query being of special interest here. The problem is documented in ticket 4992 (Update: it is now in Django).

Given the following URL:

http://example.com/items/?order_by=name

…Django will ignore the query part when determining a cache key so the key for the above request will be:

/items/

Any type of query parameter will make Django ignore the cached page. Django will not create a new cache item for the order_by request. This will be detrimental for the performance of your site. I had expected Django to create three different cache items for these URLs instead of one cache item and two ignored requests:

http://example.com/items/

http://example.com/items/?order_by=name

http://example.com/items/?order_by=date

The solution

Fortunately Django’s source is very readable and easy to adapt to your own needs. A few minor changes to middleware/cache.py and utils/cache.py and you are ready to go. For details see the patch I attached to ticket 4992.

I recently deployed a Django site to get an overview of VPS hosting plans and the ability to cache items based on the filtering parameters gives much better performance.