|
R. Pelizzi
r.pelizzi at virgilio.it
Fri Aug 27 21:09:40 EDT 2004
A few days ago i was trying to implement a "counter" for a site... i had
to keep track of the number of active sessions and i was asking for a
way to store variables global to the whole server. There was no way to
do that, so i tought i could implement a dbm db file and pickle the
values. I can't see any way to implement an efficient locking mechanism
(since semaphores cannot be shared between interpreters), what would you
use? Would using files as semaphores be very inefficient?
Anyway, i thought i would just implement locking later, and i started
the implementation. I created a class called Application, which is
perfectly working (tough not thread-safe as i explained before) and can
be access like a dictionary.
Ok, then i needed a way to register a cleanup function. To use
Session.cleanup i had to subclass BaseSession. This is where the
problems come in.
Look at the code:
------------------
from mod_python import Session
import anydbm, UserDict, pickle
class Application:
"""Questa classe permette di condividere tra più istanze oggetti
serializzabili
"""
def __init__(self):
self.file = anydbm.open("boh", "c")
self.load()
def __len__(self):
return len(self.dict)
def __getitem__(self, key):
return self.dict[key]
def __setitem__(self, key, value):
self.dict[key] = value
def save(self):
self.file['dict'] = pickle.dumps(self.dict)
def load(self):
try:
self.dict = pickle.loads(self.file['dict'])
except KeyError:
#il file è nuovo
self.dict = {}
def __del__(self):
self.save()
class MySession(Session.BaseSession):
def __init__(self, req):
Session.BaseSession.__init__(self, req)
Session.CLEANUP_CHANCE = 5
self.dict = Application()
try:
self.dict["count"] += 1
except KeyError:
self.dict["count"] = 1
def cleanup():
self.dict["count"] -= 1
def countActiveSessions():
return self.dict["count"]
def index(req):
sess = MySession(req)
return "ciao"
--------------------
now, this is the error i get when i run application.py:
-------------------
Mod_python error: "PythonHandler mod_python.publisher"
Traceback (most recent call last):
File "/usr/lib/python2.3/site-packages/mod_python/apache.py", line
299, in HandlerDispatch
result = object(req)
File "/usr/lib/python2.3/site-packages/mod_python/publisher.py", line
136, in handler
result = util.apply_fs_data(object, req.form, req=req)
File "/usr/lib/python2.3/site-packages/mod_python/util.py", line 361,
in apply_fs_data
return object(**args)
File "/home/riccardo/web/application.py", line 50, in index
File "/home/riccardo/web/application.py", line 35, in __init__
Session.Session.__init__(req)
File "/usr/lib/python2.3/site-packages/mod_python/Session.py", line
124, in __init__
if self.load():
File "/usr/lib/python2.3/site-packages/mod_python/Session.py", line
185, in load
dict = self.do_load()
AttributeError: 'MySession' object has no attribute 'do_load'
-------------------------
what is do_load? and how come MySession hasn't got a method called
do_load if it is a child of BaseSession?
Have i made any mistakes that prevent MySession to be a 100% child of
BaseSession? This would be a very strange behaviour... Any clues?
thank you
|