Chris Jackson
christopher.jackson at gmail.com
Fri Jan 14 17:06:59 EST 2005
Okay, after playing with passing the session id around, I have been making successful progress. A couple of observations.... 1. As stated earlier, whenever I perform a sess = Session(req), a new session is created with new values. But I only want this to happen once; Subsequent calls to Session(...) should use the previous session values. Inter-process techniques which Session() makes transparent via file processes/pickling is good at this, except I need the correct session id in order to use the same session. 2. I added a sessid parameter to my handler functions so that when the handler gets called a sessid will be passed to it, so that sess = Session(req, sessid, None, 1800, 0) works. Also, note the 0 for the lock. Attempting to put this value to a 1 results in the page hanging because only one session object is allowed to be instantiated at a time, but I have multiple objects floating around. 3. The first called to otherFunc(..., sessid=""), I can insert the sessid manually, but if I attempt to do this through a user input form...I run into a problem. The solution I used is to create an <input type="hidden"...> field, with a value of the sessid being passed through the PSP template. <input type="hidden" name="sessid" value="<%=sessid%>"> And of course this PSP template uses POST so that no one can steal a session id and hence a session. This seems to be working for me, for the results I'm looking for. If I have holes or if I've overlooked something, then please offer a critique. Thanks for all the help and comments. ~= Chris =~ On Fri, 14 Jan 2005 13:31:56 -0500, Chris Jackson <christopher.jackson at gmail.com> wrote: > This seems correct however, if in "func" I create a session {key:value} > > ... > e.g. sess['mykey'] = myvalue > sess.save() > ... > > Then, when I get to "otherFunc" and try to access sess['mykey'], > I get a KeyError because it has created a new sess object. > > The solution I'm trying to do now is pass around the sess.id() to each function, > and then create new sessions based on this sess.id() > > sess = Session(req, sessid, None, 1800, 1) > > Unless there is some other way so that I do not get KeyErrors. Also > note that at the end of each function i'm using > req.internal_redirect(...). I don't know if the internal_redirect is a > problem or not. > > ~= Chris =~ > > > On Fri, 14 Jan 2005 14:22:50 +0900, Hiroaki KAWAI <kawai at iij.ad.jp> wrote: > > Please don't put sess in global scope as Manfred Stienstra mentioned > > previously. That scope is module scope, one in one interpreter. > > > > Every function that use session would be like this: > > > > def func(req): > > sess=Session(req) # you always need this line. > > sess.load() > > # do something > > sess.save() > > return "something" > > > > The problem you encountered was: > > - send request to httpd > > - new python interpreter is created (httpd child process > > is creatated) > > - your python module for Publisher Handler loaded. > > - call otherFunc at the first time. > > - if you drop "sess=Session(req)", sess.load() is passed, which means > > NoneType type ojbect method call. > > > > > > > Hmm... the session object is still dropping (being lost) , the > > > recovered (being remember) from time to time. > > > > > > Brief view of the Publisher Handler setup. > > > *Note the sess variable is not visible to other functions unless > > > declared globally. > > > > > > [Global Space] > > > sess = None > > > > > > def login(req): > > > global sess > > > sess = Session(req) > > > sess['this'] = 'that' > > > ...<more code>... > > > sess.save() > > > return > > > > > > def otherFunc(req): > > > global sess > > > sess = Session(req) # tested with and without this line (correct?) > > > sess.load() > > > ...<more code>... > > > sess.save() > > > return > > > > > > I can see the session being written to a file in a serialized way in /tmp > > > mp_sess.dbm.bak > > > mp_sess.dbm.dat > > > mp_sess.dbm.dir > > > > > > I've also executed a: > > > > > > watch -d 'ls -l /tmp/mp*' > > > > > > And upon creating new sessions...via separate browsers... I have seen the file > > > size fo the above files grow in real-time, which means that data is in > > > fact being added to the sessions which are partly human-readable. > > > > > > However, the problem I'm having is that occasionally when > > > transitioning to other pages such as http://mysite.com/otherFunc, > > > > > > will return 'NoneType' object has no attribute 'load' # referring to > > > the sess object. > > > > > > So I click the [BACK] button in the browser and re-submit the data. > > > After about 7 times, the script all of a sudden recognizes the sess > > > object. Sometimes this error does not happend and loads on the first > > > try. How can I prevent this behavior? > > > > > > ~= Chris =~ > > > > > > > > > On Wed, 12 Jan 2005 23:48:39 +0900, Hiroaki KAWAI <kawai at iij.ad.jp> wrote: > > > > Of cource, most popular and easiest way is to use Session module. > > > > Session will store the information somewhere in 'session storage' that > > > > the module knows how to get it, and the actual mechanism is hidden. > > > > # i.e., inter-process communication via file or database. > > > > > > > > So, make sure that you save the session information to the session > > > > storage in each request processing as Ron says. ;-) > > > > > > > > > > > > Chris Jackson <christopher.jackson at gmail.com> wrote: > > > > > Ah, that makes sense...Now I just need to find which "inter-process" > > > > > technique I should be using in order to maintain consistency ;) > > > > > > > > > > ~= Chris =~ > > > > > > > > > > > > > > > On Wed, 12 Jan 2005 12:55:47 +0900, Hiroaki KAWAI <kawai at iij.ad.jp> wrote: > > > > > > > > Depending on what type of apache configuration you run, one or more > > > > > > > > interpreters will be used. Sometimes interpreters die and new ones get > > > > > > > > created. > > > > > > > > > > > > > > Hmm...it's interesting you say that somtimes the interpreters die and > > > > > > > new ones get created because I'm running into a "problem" where I will > > > > > > > test a mod_python page and it will works perfectly several times again > > > > > > > and again, but then i'll test it out again, and the interpreter seems > > > > > > > to "forget" the values. I'll keep testing the page with the same > > > > > > > values, and then the page will work again. > > > > > > > > > > > > One interpreter is created per one apache child process. If you're running > > > > > > prefork MPM (and set MaxRequestsPerChild or have multiple spare child > > > > > > servers), you're posting a HTTP request sometimes to the same interpreter, > > > > > > sometimes to other interpreter. > > > > > > I think one of 'inter-process' techniques is useful for what you're > > > > > > trying. > > > > > > # If I'm saying wrong, someone please correct. :-) > > > > > > > > > > > > ---Hiroaki Kawai > > > > > > > > > > > > _______________________________________________ > > > > > > Mod_python mailing list > > > > > > Mod_python at modpython.org > > > > > > http://mailman.modpython.org/mailman/listinfo/mod_python > > > > > > > > > > > > > > ---Hiroaki Kawai > > > > > > > > _______________________________________________ > > > > Mod_python mailing list > > > > Mod_python at modpython.org > > > > http://mailman.modpython.org/mailman/listinfo/mod_python > > > > > > > > _______________________________________________ > > Mod_python mailing list > > Mod_python at modpython.org > > http://mailman.modpython.org/mailman/listinfo/mod_python > > >
|