[mod_python] Help with session.save and register_cleanup

Jeff Hinrichs - DM&T jeffh at dundeemt.com
Sun May 6 01:06:47 EDT 2007


Graham,

Thanks for the feedback.  I reverted back to the method you wrote
about.  I had that originally but I was trying to tidy up a lonely
looking function.  Not that big of a deal.  Thanks again.

Hey, -- while we are chattting, have you ever tried putting a
decorator around a vampire.pathArgs wrapped class method? i..e

def mysession(fn):
  def _setup(req, *args, **kwargs):
        #if session isn't part of the req object, add it

        if not hasattr(req,"session"):

            req.session = Session.Session(req)

        #register session.save as a cleanup

        req.register_cleanup(_savesession, req)

        #now call the original

        return fn(req,*args,**kwargs)

    return _setup

class Foo:
  def __init__(self):
    self.bar = vampire.PathArgs(self._bar)

  @mysession
  def _bar(self, req, id):
    ... do something..

@mysession
def baz(req):
  ...do something...

Using the decorator on the global works just fine, but using the
decorator on the _bar method of the Foo class gives back some very
curious errors -- appears to be confusing the heck out of things.
Complains about Foo not having an "options"  -- feels like the vampire
wrapper and the decorator are intermingling in an unhappy way.

I am quite new to making my own decorators so I could very well be
doing something quite idiotic ;)

I don't require the use of decorators as I can replace them with a
different idiom that is almost as effective.  using mysession as an
example, I rip out the fancy wrapper then make it into a normal bit.

def mysession(req):
       #if session isn't part of the req object, add it
        if not hasattr(req,"session"):
            req.session = Session.Session(req)
        #register session.save as a cleanup
        req.register_cleanup(_savesession, req)

Then I just:

class Foo:
  def __init__(self):
    self.bar = vampire.PathArgs(self._bar)

  def _bar(self, req, id):
    mysession(req)
    ... do something..

Amount of code is about the same, no functionality given up in this
instance -- so the question about the decorator is out of curiosity
not that my app won't work without them.  The same could be done with
@require_admin v. require_admin(req), kind of an anti-decorator
pattern.<g>

Thanks for all of your help.

-Jeff
http://www.OmahaPython.org

On 5/5/07, Graham Dumpleton <graham.dumpleton at gmail.com> wrote:
> A cleanup function will always be passed one argument. This will be
> the data which is supplied when register_cleanup() is called. If no
> cleanup data is supplied, then None will be passed as cleanup data.
> Because Session object save() method already has a 'self' argument,
> the cleanup data becomes the second argument it complains about.
>
> In short, do this:
>
>   def _cleanup(session):
>     session.save()
>
>   req.register_cleanup(_cleanup, req.session)
>
> Graham
>
> On 06/05/07, Jeff Hinrichs - DM&T <jeffh at dundeemt.com> wrote:
> > I know that I am missing something here but googling and banging my
> > head aren't working so I'll ask.
> >
> > I'm trying to register the session.save method from the Session I've
> > attached to the req object in the req.register_cleanup()  like this:
> >
> > # housekeeping setup for a request
> >
> > def housekeeping(fn):
> >
> >     def _setup(req, *args, **kwargs):
> >
> >         #if session isn't part of the req object, add it
> >
> >         if not hasattr(req,"session"):
> >
> >             req.session = Session.Session(req)
> >
> >             req.session['housekeeped']=1
> >
> >         #register session.save as a cleanup
> >
> >         req.register_cleanup(req.session.save)
> >
> >         #now call the original
> >
> >         return fn(req,*args,**kwargs)
> >
> >     return _setup
> >
> >
> > @housekeeping
> > def login(req):
> >
> >     req.session['foo']='bar'
> >
> >     return "We are in login() %s" % req.session.keys()
> >
> > Everything seems peachy, the results returned are:
> >
> >   We are in login() ['foo', 'housekeeped']
> >
> > However, the register_cleanup fails to save the session, and is
> > returning the following err:
> >
> > [notice] vampire: Reimporting module
> > '/usr/home/apache22/lakota.dundeemt.pri/dora/index.py'
> > [error] [client 192.168.2.52] python_cleanup: Error calling cleanup
> > object <bound method DbmSession.save of {'housekeeped': 1}>
> > [error] [client 192.168.2.52]     exceptions.TypeError: save() takes
> > exactly 1 argument (2 given)
> >
> > I've tried changing the register_cleanup to call req.session.save()
> > (as opposed to .save) but that complains, correctly, that save() is
> > not callable.
> >
> > First question, can I register multiple items with multiple calls to
> > req.register_cleanup? i.e.
> > req.register_cleanup(_closedb, req)
> > req.register_cleanup(req.session.save)
> >
> > or is that my problem?  Or have I just been at the keyboard too long
> > to see the error that probably is staring me in the face?  The db
> > cleanup appears to be working without error nor phantom connections.
> >
> > Thanks,
> >
> > Jeff Hinrichs
> > http://www.OmahaPython.org/
> > _______________________________________________
> > Mod_python mailing list
> > Mod_python at modpython.org
> > http://mailman.modpython.org/mailman/listinfo/mod_python
> >
>


-- 
Jeff Hinrichs
Dundee Media & Technology, Inc
jeffh at dundeemt.com
402.320.0821


More information about the Mod_python mailing list