[mod_python] Publisher and DEFLATE Filter

Clodoaldo clodoaldo.pinto.neto at gmail.com
Sat Dec 2 18:34:39 EST 2006


2006/12/2, Graham Dumpleton <grahamd at dscpl.com.au>:
>
> On 03/12/2006, at 5:12 AM, Clodoaldo wrote:
>
> > I want all the Publisher produced pages to be Apache DEFLATEd. So i
> > added this directive to the virtual server configuration.
> >
> >   AddOutputFilter DEFLATE py
> >
> > As the Publisher does not require a py extension this obviously does
> > not work. The AddOutputFilterByType directive is said to be deprecated
> > in the 2.2.3 manual. So i add req.add_output_filter('DEFLATE') to the
> > script and it works. But it will have to be added to all the scripts.
> > Is there a way to set the DEFLATE filter to all Publisher scripts?
> >
> > If i use "SetOutputFilter DEFLATE" it will deflate everything
> > including images and i will have to somehow disable it for the files
> > or directories i eventually don't want to be deflated.
> >
> > I looked at the PythonOutputFilter but to activate it the
> > AddOutputFilter directive must be used and it is back to the original
> > problem. Or do I understand it wrong?
>
> Presuming you are using something like:
>
>    SetHandler mod_python
>    PythonHandler mod_python.publisher
>

That's what i am using. Should have declared it first.

> Instead using something like:
>
>    SetHandler mod_python
>    PythonHandler ~/_filters.py
>    PythonHandler mod_python.publisher
>
> Then in '_filters.py' in the handler root directory have:
>
>    from mod_python import apache
>
>    def handler(req):
>      req.add_output_filter('DEFLATE')
>      return apache.OK
>
> This is making use of the ability to stack handlers, ie., have more than
> one executed for the phase.
>
> You could also have written:
>
>    SetHandler mod_python
>    PythonHandler ~/_publisher.py
>
> Then in '_publisher.py' in the handler root directory have:
>
>    from mod_python import publisher
>
>    def handler(req):
>      req.add_output_filter('DEFLATE')
>      return publisher.handler(req)
>

Both solutions are great! I took the last one and applied it immediately.

> I have used an underscore prefix for the file adding the filter as
> then publisher
> will ignore it and not allow requests against it.
>
> Note for others, this requires mod_python 3.3 as it is only in 3.3
> which the
> ability to add output filters dynamically was added. Knowing it was
> 3.3, I have
> used the path method for referencing a module in the handler directive,
> which is another new 3.3 feature.
>
> BTW, using a wrapper like '_publisher.py' is also one way of managing
> the
> creation of user sessions without having to add the session code in
> every
> handler. For example:
>
>    from mod_python import publisher, Session
>
>    def handler(req):
>      req.add_output_filter('DEFLATE')
>      req.session = Session.Session(req)
>      if req.session.is_new():
>        ...
>      ...
>      return publisher.handler(req)

This tip is Very important.

>
> For more complicated session stuff requiring login and which needs to
> control
> access to static files or other types of handlers, you are much
> better off using
> an authenhandler(), something which is much easier to do properly in
> 3.3.
>
> Graham
>


-- 
Clodoaldo Pinto Neto


More information about the Mod_python mailing list