Hi, all.
I'm currently working on a new (straight SQL-)based session persistence
mechanism for several packages, to replace an old, somewhat broken, and
overly-complex O/R-mapping-based session persistence mechanism that I've
been using.
So, I spent some time reading through session.py (which hasn't really
changed between 0.6 and 0.7a3, it seems) and trying to figure out the
best place to override the default functions for persistence.
My current SQL implementation overrides the session_mapping parameter
during the SessionManager instantiation:
SessionManager.__init__(self, MySessionObj, SqlTableMap(db_conn))
where 'SqlTableMap' mediates between the dictionary and the SQL table and
MySessionObj is a subclass of session.Session (the default Quixote session
class).
There are two reasons why this is an imperfect approach:
* I haven't figured out how to deal with transactions, so for the
moment I'm committing each time a change is made to the mapping.
My problem here is that I haven't yet grokked the implications of
combining a single database with multiple SCGI server processes.
* Loading sessions from the SQL database is a pain, unless I completely
re-implement the session.Session class. The pain is because
session.Session takes an HTTPRequest object, which I cannot
construct easily. (Right now I'm faking it with an object that
implements the get_environ function, which is all the Session
constructor needs.)
I think with a bit of thought I can figure out how to deal with transactions,
but I'm hitting a fair amount of cognitive turbulence with regards to the
session object. I could simply override SessionManager.new_session, copy
the Session code into a new class in my own app, and then use that for
a session object. A cleaner approach, IMO, would be to change the Quixote
'Session' object in several ways:
* have the constructor take the remote address directly as an argument, and
remove the 'request' object as an argument;
* have the constructor take the creation_time and access_times as optional
arguments (or provide an accessor function to *set* the creation
time) and only call time() if they are not provided.
So, the session.Session class constructor would look like this:
def __init__ (self, id, remote_addr, creation_time = None):
self.id = id
self.user = None
self.__remote_address = remote_addr
if creation_time is None:
self.__creation_time = time()
self.__access_time = time()
self._form_tokens = [] # queue
and SessionManager.new_session would just call
self.session_class(id, request.get_environ('REMOTE_ADDR'))
to create a new session class. When session classes are loaded
from the database, the creation time could be set via the constructor;
right now it's not possible (without deprecated Python judo) to set
__attributes directly.
Thoughts? Comments?
cheers,
--titus