[Zope-dev] Where best to intercept a request to send a 304 response in Zope 2

Laurence Rowe l at lrowe.co.uk
Tue Jan 5 21:00:38 EST 2010


2009/12/31 Martin Aspeli <optilude+lists at gmail.com>:
> Hi,
>
> A few of us are playing with some caching tools, trying to get to a more
> sane and less monkey patch-laden approach than CacheFu
> (Products.CacheSetup), for use with Zope 2.12.
>
> It is relatively easy to set response headers, e.g. in an
> IPubBeforeCommit event handler.
>
> However, we also need to be able to intercept a request to send a 304
> response if the underlying object has not been modified.
>
> CacheFu monkey patches ZPT rendering to avoid the actual rendering if a
> 304 response is being sent, returning an empty string instead. I'd
> rather not have such patches, though, and anyway this only work with
> things rendered as ZPTs. It also doesn't avoid any pre-work that a view
> may do before rendering its template, if indeed it has one.
>
> Another thought was to use IPubAfterTraversal, at which point we have
> the object to publish and security checks have been completed. However,
> ZPublisher.Publish goes straight from that into mapply().
>
> Can anyone think of a good way to do this? Maybe we need to add some
> kind of condition around mapply(), e.g. to do not nothing if there's a
> 304 response header, or some other marker?

I think this is analogous to 404 Not Found errors. It should be
possible to handle them with the combination of:

  * raise a NotModified exception in an IPubAfterTraversal handler
  * in a NotModified exception view, setStatus 304 Not Modified an
return an empty string.

Laurence


More information about the Zope-Dev mailing list