[Stackless] http session management

Aaron Watters aaron at reportlab.com
Fri Sep 6 19:06:51 CEST 2002


One of the biggest pains of doing work with http is
trying to keep track of what's going on in a complex
multistage transaction, when http itself is "stateless".

This generally results in lots of hidden variables and
the usual state-machine code obfuscation.

Just wanted to share that I'm having some success
keeping track of "sessions" using tasklets that get "reconnected"
to http interactions within an http server.  My first test
for managing sessions within the framework looks like this
at present..


def testprocessor(session, channel, scheduler):
    donesignal = None
    try:
        # generate fibonnaci numbers
        a = b = 1
        memo = "guest"
        for i in range(6):
            # finish last interaction
            if donesignal is not None:
                donesignal.send(1)
            # wait for next connection for this session
            (dictionary, socket, Sock, addr, donesignal, debug) = 
channel.receive()
            scheduler.send(socket, "HTTP/1.0 200 OK\r\n")
            scheduler.send(socket, "Content-type: text/html\r\n")
            scheduler.send(socket, "\r\n")
            scheduler.send(socket, """
            Welcome %s to session %s<hr>
            i=%s a=%s b=%s<br>
            <a href="test.cgi?session=%s">go around again!</a>
            """ % (memo, session, i, a, b, session,))
            a, b = b, a+b
            memo = "back"
        scheduler.send(socket, "<h3>This session is done now</h3>")
        donesignal.send(1)
    finally:
        if donesignal is not None and donesignal.balance<0: # ???
            donesignal.send(1)

In the session tasklet this function generates 6 screens in sequence 
when the user presses
"go around again".  The first looks like this:

Welcome guest to session 1031330478.68
------------------------------------------------------------------------
i=0 a=1 b=1
go around again! <http://localhost:8000/test.cgi?session=1031330368.23>

and the last looks like this

Welcome back to session 1031330478.68
------------------------------------------------------------------------
i=5 a=8 b=13
go around again! <http://localhost:8000/test.cgi?session=1031330478.68>


      This session is done now

The interesting thing is that this is "straight line code" even though
the 6 http interactions are independent.

Having implemented more  HTTP state machines than a sane person should
be permitted on one lifetime I'm finding this alternative quite 
refreshing :).
Comments?

I'll share  some code once I've played a bit more.

   -- Aaron Watters


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.stackless.com/pipermail/stackless/attachments/20020906/049486db/attachment.htm>


More information about the Stackless mailing list