加个 bsddb 存储,效率会好些
diff --git a/web/session.py b/web/session.py
index 37ae849..0ca72db 100644
--- a/web/session.py
+++ b/web/session.py
@@ -9,6 +9,7 @@ import datetime
import random
import md5
import base64
+import bsddb
try:
import cPickle as pickle
except ImportError:
@@ -220,6 +221,60 @@ class DiskStore(Store):
if now - atime > timeout :
os.remove(path)
+class BDBStore(Store):
+ """Store for saving a session in bsddb
+
+ >>> import tempfile
+ >>> root = tempfile.mkdtemp()
+ >>> s = BDBStore(root)
+ >>> s['a'] = 'foo'
+ >>> s['a']
+ 'foo'
+ >>> time.sleep(0.01)
+ >>> s.cleanup(0.01)
+ >>> s['a']
+ Traceback (most recent call last):
+ ...
+ KeyError: 'a'
+ """
+ def __init__(self, root):
+ if hasattr(root, '__getitem__') and hasattr(root, '__setitem__'):
+ self.db = root
+ return
+ if not os.path.isdir(root):
+ os.makedirs(root)
+ dbenv = bsddb.db.DBEnv()
+ #dbenv.set_shm_key(23)
+ dbenv.open(root, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL
| bsddb.db.DB_THREAD)
+ d = bsddb.db.DB(dbenv)
+ d.open('sessions.db', bsddb.db.DB_BTREE, bsddb.db.DB_CREATE, 0666)
+ self.db = bsddb._DBWithCursor(d)
+
+ def __contains__(self, key):
+ return key in self.db
+
+ def __getitem__(self, key):
+ if key in self.db:
+ return pickle.loads(self.db[key])[1]
+ else:
+ raise KeyError, key
+
+ def __setitem__(self, key, value):
+ self.db[key] = pickle.dumps((time.time(), value))
+
+ def __delitem__(self, key):
+ if key in self.db:
+ del self.db[key]
+
+ def cleanup(self, timeout):
+ if not hasattr(self.db, 'iteritems'):
+ return
+ now = time.time()
+ db = self.db
+ for key, value in db.iteritems():
+ if now - pickle.loads(value[0]):
+ del db[key]
+
class DBStore(Store):
"""Store for saving a session in database
Needs a table with the following columns:
同意~
反正,sohu 的 yqb 每公开一个补丁,我也将跟着在 webpy ml 发一个,
如果他肯把搜狐闪电邮的代码放出来(大部分),我就也放出全部补丁~
待会哦,
DiskStore 和 BDBStore 目录最好不要一样,
BDBStore 的目录是 bsddb 环境,
DiskStore 目录里是 base64 的 pickle,
bsddb 环境给 DiskStore 读取会死掉的(反过来没问题)。
--
http://zoomquiet.org'''
过程改进乃是催生可促生靠谱的人的组织!
PE keeps evolving organizations which promoting people be good!'''
[HR]金山软件常年招聘大量Py/C++人才!
https://groups.google.com/group/python-cn/web/ot-py-c
简历直投俺就好;-)