Graham Dumpleton wrote:
Jim Gallacher wrote ..

The idea of something like req.get_session() is to give users an obvious
way to grab a session object without the deadlock concerns. How many times have we seen this kind of problem-code on the mailing list?

def index(req):
    sess = Session.Session(req)
    do_stuff(req)
    ...

def do_stuff(req):
    sess = Session.Session(req)
    ... do other stuff.

Having the session constructor check for the existence of req.session is
of no use here. We need a way to make sure only *one* session instance
is created per request. (Bonus marks for making it work with internal redirect).


FWIW, I use the following in a class based authenhandler.
thread = threading.currentThread() if self.__cache.has_key(thread):
            req.session = self.__cache[thread]
        else:
            req.session = Session.Session(req)
self.__cache[thread] = req.session
            def cleanup(data): del self.__cache[thread]
            req.register_cleanup(cleanup)

In short, store it in a cache outside of the request object keys by
the thread ID.

Works for both internal redirects and also for fast redirects as used by
DirectoryIndex matching algorithm, although for the latter there are
other issues as I have documented in MODPYTHON-146.

My thinking keeps changing a bit, but overall I have been leaning
towards not having a get_session() like function explicitly provided and
instead documenting how to correctly write a authenhandler which can
handle form based login with sessions. Ie., use Apache phases properly
rather than pushing authentication into content handler phase as most
do.

Which is all good, but you are assuming that people are only using sessions for authentication purposes. Consider a shopping cart implemented as session: the user may not be authenticated until *after* they have filled their cart and are ready to checkout. Perhaps the cache code would be better off in Session.py?

Jim



Reply via email to