web.py 3.0 的 bsddb 存储 sessions

6 views
Skip to first unread message

Jiahua Huang

unread,
Oct 4, 2008, 11:12:33 PM10/4/08
to Python.cn@google
web.py 3.0 自带的 sessions 模块只有文件跟数据库存储两个,

加个 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:

webpy-session-BDBStore.patch

Bibby

unread,
Oct 21, 2008, 12:50:16 AM10/21/08
to python-cn`CPyUG`华蟒用户组
这个 patch 发到 webpy 的 google group 里了么?

http://groups.google.com/group/webpy

Jiahua Huang

unread,
Oct 21, 2008, 12:53:12 AM10/21/08
to pyth...@googlegroups.com
2008/10/21 Bibby <michae...@gmail.com>:

> 这个 patch 发到 webpy 的 google group 里了么?
>
> http://groups.google.com/group/webpy
>

木有,送给 Bibby 算了~

反正 sohu 的 yqb 手里没有发出来的 patch 比我多得多~

Bibby

unread,
Oct 21, 2008, 12:55:44 AM10/21/08
to python-cn`CPyUG`华蟒用户组


On Oct 21, 12:53 pm, "Jiahua Huang" <jhuangjia...@gmail.com> wrote:
> 2008/10/21 Bibby <michaelbi...@gmail.com>:
>
> > 这个 patch 发到 webpy 的 google group 里了么?
>
> >http://groups.google.com/group/webpy
>
> 木有,送给 Bibby 算了~
>
> 反正 sohu 的 yqb 手里没有发出来的 patch 比我多得多~

晕。那我代你将这个补丁发到 google group 里去。

Bibby

unread,
Oct 21, 2008, 12:58:05 AM10/21/08
to python-cn`CPyUG`华蟒用户组


On Oct 21, 12:55 pm, Bibby <michaelbi...@gmail.com> wrote:
> 晕。那我代你将这个补丁发到 google group 里去。

忘了问了:是否同意将你的代码,使用与 webpy 一致的版权进行发布?

Jiahua Huang

unread,
Oct 21, 2008, 1:02:23 AM10/21/08
to pyth...@googlegroups.com
2008/10/21 Bibby <michae...@gmail.com>:

> On Oct 21, 12:55 pm, Bibby <michaelbi...@gmail.com> wrote:
>> 晕。那我代你将这个补丁发到 google group 里去。
>
> 忘了问了:是否同意将你的代码,使用与 webpy 一致的版权进行发布?
>

同意~

Jiahua Huang

unread,
Oct 21, 2008, 1:06:05 AM10/21/08
to pyth...@googlegroups.com
2008/10/21 Bibby <michae...@gmail.com>:

> 晕。那我代你将这个补丁发到 google group 里去。
>

反正,sohu 的 yqb 每公开一个补丁,我也将跟着在 webpy ml 发一个,

如果他肯把搜狐闪电邮的代码放出来(大部分),我就也放出全部补丁~

Bibby

unread,
Oct 21, 2008, 1:06:29 AM10/21/08
to python-cn`CPyUG`华蟒用户组


On Oct 21, 1:02 pm, "Jiahua Huang" <jhuangjia...@gmail.com> wrote:
> 2008/10/21 Bibby <michaelbi...@gmail.com>:
>
> > On Oct 21, 12:55 pm, Bibby <michaelbi...@gmail.com> wrote:
> >> 晕。那我代你将这个补丁发到 google group 里去。
>
> > 忘了问了:是否同意将你的代码,使用与 webpy 一致的版权进行发布?
>
> 同意~

OK.

刚才在最新的 webpy 上打补丁,无法通过:

----<----
# ls
build experimental setup.py test test.py tools web

# patch -p1 < webpy-session-BDBStore.patch
patching file web/session.py
Hunk #1 FAILED at 9.
Hunk #2 succeeded at 222 (offset 1 line).
1 out of 2 hunks FAILED -- saving rejects to file web/session.py.rej
----<----

麻烦 jiahua 再给修改一下 ^_^

Bibby

unread,
Oct 21, 2008, 1:09:12 AM10/21/08
to python-cn`CPyUG`华蟒用户组


On Oct 21, 1:06 pm, "Jiahua Huang" <jhuangjia...@gmail.com> wrote:
> 2008/10/21 Bibby <michaelbi...@gmail.com>:
>
> > 晕。那我代你将这个补丁发到 google group 里去。
>
> 反正,sohu 的 yqb 每公开一个补丁,我也将跟着在 webpy ml 发一个,
>
> 如果他肯把搜狐闪电邮的代码放出来(大部分),我就也放出全部补丁~

每个人的想法都不一样,他在版权许可的条件下有自己的自由。何必强求?

Jiahua Huang

unread,
Oct 21, 2008, 1:11:29 AM10/21/08
to pyth...@googlegroups.com
2008/10/21 Bibby <michae...@gmail.com>:
> 每个人的想法都不一样,他在版权许可的条件下有自己的自由。何必强求?
>

哈,只是想找机会拜读下 yqb 的闪电邮~

Bibby

unread,
Oct 21, 2008, 1:14:19 AM10/21/08
to python-cn`CPyUG`华蟒用户组
将你的代码手工复制到 session.py 里,重新生成了一个 patch:

diff --git a/web/session.py b/web/session.py
index 996b58f..e5b6956 100644
--- a/web/session.py
+++ b/web/session.py
@@ -3,7 +3,7 @@ Session Management
(from web.py)
"""

-import os, time, datetime, random, base64
+import os, time, datetime, random, base64, bsddb
try:
import cPickle as pickle
except ImportError:
@@ -221,6 +221,60 @@ class DiskStore(Store):

Jiahua Huang

unread,
Oct 21, 2008, 1:16:18 AM10/21/08
to pyth...@googlegroups.com
2008/10/21 Bibby <michae...@gmail.com>:
> 刚才在最新的 webpy 上打补丁,无法通过:
>

ok, 附件

webpy-session-BDBStore.patch

Jiahua Huang

unread,
Oct 21, 2008, 1:17:50 AM10/21/08
to pyth...@googlegroups.com
2008/10/21 Bibby <michae...@gmail.com>:

>
> 将你的代码手工复制到 session.py 里,重新生成了一个 patch:
>


Bibby

unread,
Oct 21, 2008, 1:20:35 AM10/21/08
to python-cn`CPyUG`华蟒用户组
已经将你的 patch 发布到 webpy 的 ML:
http://groups.google.com/group/webpy/t/4b1311e712a05076

Thanks again ^_^

Bibby

unread,
Oct 21, 2008, 1:29:10 AM10/21/08
to python-cn`CPyUG`华蟒用户组


On Oct 21, 1:20 pm, Bibby <michaelbi...@gmail.com> wrote:
> 已经将你的 patch 发布到 webpy 的 ML:http://groups.google.com/group/webpy/t/4b1311e712a05076
>
> Thanks again ^_^

session = web.session.Session(app,
#web.session.DiskStore(curdir + '/' + 'sessions'),
web.session.BDBStore(curdir + '/' + 'sessions'),
#initializer={'username': 'anonymous'},
)

It works. ^_^

Jiahua Huang

unread,
Oct 21, 2008, 1:37:09 AM10/21/08
to pyth...@googlegroups.com
2008/10/21 Bibby <michae...@gmail.com>:

>
> session = web.session.Session(app,
> #web.session.DiskStore(curdir + '/' + 'sessions'),
> web.session.BDBStore(curdir + '/' + 'sessions'),
> #initializer={'username': 'anonymous'},
> )
>

待会哦,
DiskStore 和 BDBStore 目录最好不要一样,
BDBStore 的目录是 bsddb 环境,
DiskStore 目录里是 base64 的 pickle,

bsddb 环境给 DiskStore 读取会死掉的(反过来没问题)。

Bibby

unread,
Oct 21, 2008, 1:44:11 AM10/21/08
to python-cn`CPyUG`华蟒用户组


On Oct 21, 1:37 pm, "Jiahua Huang" <jhuangjia...@gmail.com> wrote:
> 2008/10/21 Bibby <michaelbi...@gmail.com>:
>
>
>
> > session = web.session.Session(app,
> > #web.session.DiskStore(curdir + '/' + 'sessions'),
> > web.session.BDBStore(curdir + '/' + 'sessions'),
> > #initializer={'username': 'anonymous'},
> > )
>
> 待会哦,
> DiskStore 和 BDBStore 目录最好不要一样,
> BDBStore 的目录是 bsddb 环境,
> DiskStore 目录里是 base64 的 pickle,
>
> bsddb 环境给 DiskStore 读取会死掉的(反过来没问题)。

多谢提醒,刚才只是简单做测试用的。我修正一下自己的代码。

Thanks ^_^

Zoom.Quiet

unread,
Oct 21, 2008, 2:16:17 AM10/21/08
to pyth...@googlegroups.com
2008/10/5 Jiahua Huang <jhuang...@gmail.com>:

> web.py 3.0 自带的 sessions 模块只有文件跟数据库存储两个,
>
> 加个 bsddb 存储,效率会好些
>
直接附件补丁文件就好,,,


--
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
简历直投俺就好;-)

Bibby

unread,
Oct 21, 2008, 8:21:00 AM10/21/08
to python-cn`CPyUG`华蟒用户组
Jiahua,

被 webpy 的作者告知 bsddb 模块在 python 2.6 里被移除了(module bsddb is deprecated
since python 2.6.)。
http://groups.google.com/group/webpy/browse_thread/thread/4b1311e712a05076

但是我仍然建议他收录该补丁,因为 RHEL/CentOS 5.x 的生命周期共有 7-8 年,而如今还有 5-6 年的生命周期,所以为了这些
enterprise linux 的用户,希望他能收录该补丁。

Bibby

unread,
Oct 21, 2008, 8:23:06 AM10/21/08
to python-cn`CPyUG`华蟒用户组


On Oct 21, 8:21 pm, Bibby <michaelbi...@gmail.com> wrote:
> Jiahua,
>
> 被 webpy 的作者告知 bsddb 模块在 python 2.6 里被移除了(module bsddb is deprecated
> since python 2.6.)。http://groups.google.com/group/webpy/browse_thread/thread/4b1311e712a...
>
> 但是我仍然建议他收录该补丁,因为 RHEL/CentOS 5.x 的生命周期共有 7-8 年,而如今还有 5-6 年的生命周期,所以为了这些
> enterprise linux 的用户,希望他能收录该补丁。

忘了说了,RHEL/CentOS 5.x 带的是 python-2.4.x。
Reply all
Reply to author
Forward
0 new messages