|
Byron Ellacott
bje at apnic.net
Thu Aug 19 10:03:11 EDT 2004
Amir Salihefendic wrote:
>> def createSession(req):
>> def getSameSession(req, SID):
> Argh forgot something very important (to save the damn session)!:
>> Anyway, I am interested in knowing: What is the smartest way to
>> "share"/access same session across functions (i.e. when you are
>> internal "redirecting")? Example of what I mean by "redirecting" (not
>> working...):
In case saving the session in createSession() didn't solve your problem,
I'd suggest collapsing the two functions into one, since you don't seem
to really need to distinguish between creating a session and fetching an
existing one, as demonstrated by your getSameSession() function not
checking if the session it fetches is newly created:
def getSession(req):
sess = Session.Session(req)
if sess.is_new(): sess.save()
return sess
Of course, you now have the problem that the session might have already
been created during the processing of this request. I'm not very
familiar with the publisher approach, but I'm assuming it calls a method
based on the requested URL, essentially doing a dispatch for you. This
is awkward when you want to have functions done outside of the
dispatched routine, but you can alter getSession() to help out:
def getSession(req):
if not hasattr(req, 'session'):
req.session = Session.Session(req)
if req.session.is_new(): req.session.save()
return req.session
You can assign to attributes of a request object, and those attributes
will last for the lifetime of the request (but not cross-interpreter, so
be careful about request phases and which configuration directives apply
when, if you do multi-phase handlers!). So, you can cache the previous
getSession() request in the req object itself.
Of course, if your problem is solved, there's not a great deal of point
in doing this anyway, and storing attributes in the request object is
probably about as unclean as calling session.unlock() to allow you to
fetch a session twice.
--
bje
|