[albatross-users] SessionAppContext handling session timeout / deleting.
Greg Hamilton
gregh at object-craft.com.au
Thu Jun 14 10:12:56 EST 2007
On Tue, Jun 05, 2007 at 12:12:24AM +1000, Andrew McNamara wrote:
| >I'm using SessionAppContext/SimpleSessionApp for server side sessions.
| >After a server session times out and I receive a subsequent request from a
| >client (which had a session) as a result a SessionExpired exception is
| >raised (quite correctly since it timed out) which I guess I have to catch
| >at app.run(Request()).
| >
| >What is the right way to delete the old session and return a selected
| >template page? I notice your FAQ has an entry describing how to delete a
| >session when I have a handle to the context. But in this case I don't
| >have a handle to the context because of where I am handling the exception
| >and presumably because if it is expired it never got instantiated for
| >that request...
| >
| >Feel free to point me to relevant documentation (I did look but nothing
| >jumped out at me that seemed appropriate) but I am new to Albatross and
| >may have missed it.
|
| Hmmm, tricky. There's no need to delete the session, since it's already
| gone: I suspect what you should do is replace the default exception page
| with a friendlier version for this specific exception.
|
| The Application classes call their handle_exception() method when the run
| method raises an exception - you could subclass the Application class
| you've chosen, and add your own handle_exception method that presents
| your chosen template.
|
| Have a look at Application.handle_exception() in albatross/app.py -
| you'll basically want to do something very similar to what's there.
|
| If you think overloading the albatross method is against the rules,
| don't worry - this is the way Albatross is intended to be used (which
| is why all manner of "internal" methods are documented).
|
I've been bitten by this before. The default handle_exception removes
the session for any unhandled exception. The browser still has a cookie
identifying the removed session. All subsequent requests result in a
SessionExpired exception.
I work around this by removing the session and creating a new session
before I run the template which reports the error.
Something like this ...
def handle_exception(self, ctx, req):
ctx.remove_session()
ctx.new_session()
ctx.reset_content()
self.save_session(ctx)
ctx.run_template('unhandled_exception.html')
ctx.flush_content()
I'm sure Andrew will be appalled by this and suggest a far superior
solution.
Greg Hamilton
Object Craft
More information about the Albatross-users
mailing list