|
nineclue at bigfoot.com
nineclue at bigfoot.com
Sat Apr 14 11:07:12 EST 2001
Greetings...
I'm trying to implement custom session handler like PHP.
I think persistent variables that share between subinterpreters would
be nice to hold session variables.
When I tried, I think persistent variables are not shared to
subinterpreter.
Sorry for my poor English... And thanks in advance for any comment or
answer.
Suhku Huh
Followings are my custom handler.
from mod_python import apache
from base64 import decodestring, encodestring
from cPickle import loads, dumps
import pg
PG_DB = 'pyweb'
_SESSION_PATH = ( '/cluelabs', )
_MODPYTHONID = 'MODPYTHONID'
session_data = {}
class session_var:
def __init__(self, con, id = None):
self.con = con
if id:
self.new = 0
r = self.con.query("select val from session where sess_id = '%s'" % id)
if not r.ntuples():
self.data = {}
else:
val = r.getresult()[0][0]
self.data = loads(decodestring(val))
else:
import md5, time
self.new = 1
id = md5.new(str(time.time())).hexdigest()
self.data = {}
self.id = id
def __del__(self):
if len(self.data) == 0:
return
self.save()
def __getitem__(self, name):
if self.data.has_key(name):
return self.data[name]
else:
return None
def __setitem__(self, name, value):
self.data[name] = value
def __delitem__(self, name):
try:
del self.name[name]
except:
pass
def __len__(self):
return len(self.data)
def has_key(self, name):
return self.data.has_key(name)
def save(self):
if self.new:
self.con.query("insert into session values ('%s', '%s')" % (self.id, encodestring(dumps(self.data))))
else:
self.con.query("update session set val = '%s', create_time = current_timestamp where sess_id = '%s'" % (encodestring(dumps(self.data)), self.id))
def _get_cookie(req):
if req.headers_in.has_key('Cookie'):
ret = {}
cookies = req.headers_in['Cookie'].split(';')
for cookie in cookies:
equal_pos = cookie.index('=')
key, value = cookie[:equal_pos], cookie[equal_pos+1:]
ret[key.strip()] = value.strip()
return ret
else:
return None
def _start_session(req, con):
global session_data
py_log = open('/home/nineclue/py_log', 'a')
py_log.write('Session_data length : %d\n' % len(session_data))
py_log.close()
if req.cookie and req.cookie.has_key(_MODPYTHONID):
req.session_var = session_data[req.cookie[_MODPYTHONID]]
else:
req.session_var = session_var(con)
req.headers_out.add('Set-Cookie', '%s = %s' % (_MODPYTHONID, req.session_var.id))
req.send_http_header()
session_data[req.session_var.id] = req.session_var
def _get_con():
global pg_con
try:
con = pg_con
except NameError:
pg_con = pg.connect(PG_DB)
con = pg_con
return con
def handler(req):
global session_data
if req.cookie:
for key in req.cookie.keys():
req.write('Cookie (%s) : (%s)<BR>' % (key, req.cookie[key]))
req.write('Session Variable has %d items' % len(session_data))
if req.session_var.has_key('count'):
req.session_var['count'] = req.session_var['count'] + 1
else:
req.session_var['count'] = 0
req.write('Counter : %02d' % req.session_var['count'])
return apache.OK
def headerparserhandler(req):
name_split = req.uri.rfind('/')
req.path, req.pname = req.uri[:name_split], req.uri[name_split + 1:]
req.cookie = _get_cookie(req)
if req.path in _SESSION_PATH:
con = _get_con()
_start_session(req, con)
return apache.OK
When I try, counters are correctly increased at first time but Key error
is raised after and py_log (used at _start_session function) shows length
of session_data is 0.
I'm using Apache 1.3.19 with statistically compiled mod_python 2.7.2
Python/2.0 (thread enabled) in Mandrake 7.1.
|