caching and static tool

15 views
Skip to first unread message

Niibe Yutaka

unread,
Apr 10, 2011, 8:54:52 PM4/10/11
to cherrypy-devel
I found that using Static Tool with Caching Tool doesn't work well,
in some situations.

I am using version 3.1.2, and checked the code in the repository
(trunk) as well.

Note that when we use cherrypy.tools.staticdir.handler or
staticfile.handler directly, with Caching Tool, it works well.

Suppose we have a configuration like this:
-------------------------
[/]
tools.caching.on = True

[/robots.txt]
tools.staticfile.on = True
tools.staticfile.filename = 'site/robots.txt'
-------------------------

Then, staticfile is always called, even though it cached as well.

That's because both of Static Tool and Caching Tool use
'before_handler' hook.

The logic of Caching Tool is that, it disable request.handler when it
founds a page in cache. The code is:

------------------------- root/trunk/py3/cherrypy/_cptools.py
389 class CachingTool(Tool):
390 """Caching Tool for CherryPy."""
391
392 def _wrapper(self, **kwargs):
393 request = cherrypy.serving.request
394 if _caching.get(**kwargs):
395 request.handler = None
396 else:
397 if request.cacheable:
398 # Note the devious technique here of adding hooks
on the fly
399 request.hooks.attach('before_finalize',
_caching.tee_output,
400 priority = 90)
-------------------------

(BTW, should _caching.get be self.callable here?)

It doesn't stop Static Tool's 'before_handler' hook to be called.

I think that possible fix would be:

(1) Let staticdir or staticfile check if request.handler == None or
not.

(2) Then, modify lib/caching.py:get(), so that it sets request.handler
as
well when it raises HTTPRedirect. The place is here:

------------------------- root/trunk/py3/cherrypy/lib/caching.py
359 try:
360 # Note that validate_since depends on a Last-Modified
header;
361 # this was put into the cached copy, and should have
been
362 # resurrected just above (response.headers =
cache_data[1]).
363 cptools.validate_since()
364 except cherrypy.HTTPRedirect:
365 x = sys.exc_info()[1]
366 if x.status == 304:
367 cherrypy._cache.tot_non_modified += 1
+ request.handler = None
368 raise
-------------------------
--
Reply all
Reply to author
Forward
0 new messages