caching and static tool

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

caching and static tool

Niibe Yutaka-3
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
-------------------------
--

--
You received this message because you are subscribed to the Google Groups "cherrypy-devel" group.
To post to this group, send email to [hidden email].
To unsubscribe from this group, send email to [hidden email].
For more options, visit this group at http://groups.google.com/group/cherrypy-devel?hl=en.

Loading...