李迎辉

李迎辉的博客

他的个人主页  他的博客

beaker之session问题

李迎辉  2009年08月24日 星期一 21:09 | 1889次浏览 | 9条评论

beaker提供了对session和cache的访问,它是一个独立的库,用在pylons中。uliweb中也使用了它,这是可以找到的功能完整的包。不过最近在uliweb中,shuhanwu反映一个问题:

当使用api访问uliweb时,他使用的是文件方式,因为不带cookie,所以会创建非常多的session文件,占用硬盘空间很大,并且在程序中并没有对session的处理。

于是我开始研究beaker库。这个库说实在的,怎么说呢?有些乱,而且还包含了一些基本用不上的东西,比如:CookieSession。它支持多种后端,比如:文件,dbm,数据库等。它的层次挺多,比如有:SessionProxy,Session,Namespace等。通过SessionProxy来决定是使用Session还是CookieSession,然后每个Session对象对应一个Namespace,每个Namespace对应一种存储方式。Session有基本的load和save方法,在处理时会进行加锁处理。加锁有两层,一层是使用threading.Lock类,一层是使用文件系统,这种方式在windows下无效。在某些后端如Google的支持,就没有文件锁了。所以仔细想一想,beaker的session其实是不支持集群,对windows的支持有限,并且没有使用数据库的加锁机制。

那么问题是怎么产生的呢?原因就是在load时,如果文件还不存在,则beaker会自动创建。而由于客户端不带cookie,所以永远找不到后台保存的session文件,所以会一个请求就创建一个,因此文件会越来越多。现在的session生成,都不带清除的,而是让你写一个脚本去清。

先不管beaker的功能强弱,但是知道了问题却不是太好改。因为有些代码在读和写时是重叠的,比如do_open(),如果读时不存在,不创建文件,但是写也要使用这个函数,则也不会创建,则后面的保存就会失败。如果加以区别的话,其它的manager的类都要修改,动作就太大了。为什么会这样?我想是因为底层的存储与session本身没有有效的隔离,在Session类中会直接操作namespace['session']这样的处理,而不是在从namespace中load出session数据后与namespace分离,这样造成了紧耦合。总之,不是一两句可以说得清。beaker程序也是读了有阵子才是越来越明白,但是改起来还是太麻烦感觉。

想使用其它的session库替换,象werkzeug,功能太弱,比如没有锁机制,好象过期也没见着,目前只有文件支持,没有数据库支持。django目前是支持多种,文件支持也没有使用文件锁,看代码是说通过创建临时文件,然后改名来实现的,不过没有太弄明白。有时间试着把beaker改一下吧,不过难度挺高。

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !
李迎辉

回复 李迎辉  2009年08月24日 星期一 22:20

是为了显示一些缺省的信息。因为比较简单,不想再放在其它的地方了。

6条回复

  • 刘磊(V.L.)

    回复 刘磊(V.L.)  2009年08月25日 星期二 08:35

    对于缺省信息,我认为使用方法有问题就报错比较好。

    1条回复

      • 李迎辉

        回复 李迎辉  2009年08月25日 星期二 08:46

        1. 有一段是给302用的,并不是出错
        2. 404可以算做出错,但是显示什么信息好。难道要抛出一个异常吗?所以和其它的404信息一样,返回404代码和一段HTML文本是标准的做法。而且404页面是可以由用户替换的。

        0条回复

  • 刘磊(V.L.)

    回复 刘磊(V.L.)  2009年08月24日 星期一 22:24

    如果这样,就不够严谨了。拙见,呵呵。

    3条回复

      • 李迎辉

        回复 李迎辉  2009年08月24日 星期一 22:30

        严谨本身没有标准,我认为实用即可。可以拆出来,但是要增加一些导入,感觉不值得。

        2条回复

          • 刘磊(V.L.)

            回复 刘磊(V.L.)  2009年08月25日 星期二 08:30

            框架无外乎就是控制流传递,除此以外都是使用者自己的事。
            如果对于ajax非常需要HTML,可以转变思路加强对JSON的支持;实在想要,那就分离成core与plugs。
            见,呵呵。

            1条回复

              • 李迎辉

                回复 李迎辉  2009年08月25日 星期二 08:44

                在SimpleFrame.py中一个是用来显示 302对应的信息,这块如果是浏览器自动处理的话,是根本不会注意到了。放在redirect函数中。还有一个是显示缺省的Page Not Found的东西。和ajax无关。而Page Not Found是框架自动调用,不是给用户用的,所以就放在SimpleFrame.py中了。而redirect,用户也只是使用,不会去修改它。一些常见的功能,就与框架本身集成,一些可选功能就已经做成app了。在contrib中可以看到。还有一些是以库的形式存在,如template, form等。这些很少的东西放在哪里都是可以的。而且也不是说框架中就不能有html的东西,没有人给出所准标准框架应该是个什么样子的定义和标准。所以这些都不是很严重的问题,主要还是给用户使用的一致性和方便性。分开放还是合起来放,因为简单,不会是影响框架的主要原因。

                0条回复

刘磊(V.L.)

回复 刘磊(V.L.)  2009年08月24日 星期一 22:02

下了uliweb,只是奇怪为什么在框架内还要使用HTML标签。没太研究

0条回复

電波系山寨文化科学家

回复 電波系山寨文化科学家  2009年08月24日 星期一 21:25

不懂,帮顶。

0条回复

暂时没有评论

Zeuux © 2024

京ICP备05028076号