How To Make IE Cache Less
Jul 14th, 2006 by thesamet
Internet Explorer is known to cache the responses of GET calls. The problem occurs if your javascript functions request the same url over and over again. Internet Explorer will cache the response of the first call, and subsequent calls will automatically return the same response, without actually contacting the server. There are two approaches to solve this problem.
One approach could be to add a random part to the url (i.e.: /poll?random=f2dee87716f). So, the browser will think of it as a different URL everytime. An alternative approach could be to set the response headers correctly. The HTTP headers that need to be set are as follows:
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Here’s how I do it in TurboGears. To each method that I don’t want IE to cache, I add the strongly_expire decorator, like this:
@expose()
@strongly_expire
def cant_cache_me(self, position):
...
The code of the decorator, which is responsible to set the headers propertly:
def strongly_expire(func):
"""Decorator that sends headers that instruct browsers and proxies not to cache.
"""
def newfunc(*args, **kwargs):
cherrypy.response.headers['Expires'] = ‘Sun, 19 Nov 1978 05:00:00 GMT’
cherrypy.response.headers['Cache-Control'] = ‘no-store, no-cache, must-revalidate, post-check=0, pre-check=0′
cherrypy.response.headers['Pragma'] = ‘no-cache’
return func(*args, **kwargs)
return newfunc
[...] Obviously you can make the date as old as you want. All this was provided by a google search and in cherrypy you can set these within a decorator as described here. Note that the code at the link is cherrypy v2.2 so response.headers is used rather than response.headerMap (and I don’t know the relevance for cherrypy 3.x). [...]
[...] the cached old image, we add a random argument to the URL. You can see a related post describing how to prevent browsers from caching. To make the image() controller method accept this argument and ignore it, its definition becomes: [...]
Where did you add your decorator definition? The code for
def strongly_expire(func):Just in the top of the controller module.
Thanks for your reply. I tried implementing this in my code but it just seems to break it. Without adding the decorator, I am receiving the data fine in JSON format. However, if I include the
@strongly_expirebefore my function header, it seems to break it and no data comes through. Any thoughts?
Sorry, I made such a novice error. Please disregard the previous message. Thank you for providing this code snippet.