Home
JavaEE
Java GUI
Framework
DHtml
Android
插画
教程下载

ATOM 2.0   RSS 2.0
Add to iGoogle Add to Live.com
  • 今天终于收到金山快盘的邀请码
  • 利用最短ie判断在不同浏览器上播放背景音乐
  • 对插画方面的一点感受与回忆
  • 网上看到的两个死里逃生的图片,记录一下
  • 今天开通了糖果社区,附几个激活码
  • 终于可以实现我的多个微博实时同步了
  • 备案和现场拍照就是对站长们的瞎折腾
  • 对Android在互联网应用开发上的纠结
  • 收藏夹中的书签都没了,决定写一个自已的书签管理器
  • 测试自已整理的本机的webapps客户端发送博文能否成功。
  • 今天开通了糖果社区,附几个激活码
  • 终于可以实现我的多个微博实时同步了
  • 备案和现场拍照就是对站长们的瞎折腾
  • 昨天借用飞姐的佳作做的一个浪漫爱情网页
  • 有几个腾讯微博的邀请码(实时更新)
  • BB的网站移到了GAE-JAVA上了
  • 一个基于GAE Python Web.py和JQuery的留言本程序
  • 类许愿墙的一个告白网站和一个电子书网站
  • Android中用Bitmap获取图片中某个区域的图象
  • 对暴力破解带密码的QQ相册的可行性分析
  • 对淘宝web旺旺版一些通讯接口的研究

在GAE(python)中实现session,真的头都大了

posted by David Chen at February 20, 2010, 6:49 AM    

        在gae中,sql的复杂查询,图像处理等都很受限制,连实现session的存取也是一个大问题。
        gae是不支持读写文件的,但是web.py中session的存取方式DiskStore和ShelfStore是要读写文件的,不可能使用,不然会出错,还有一个DBStore,支持数据库来存取session,这个不错,但是看了web.py的源码,还是要修改才能用于gae的python平台中的。
根据web.py的文档,必须要在数据库中使用表
create table sessions (
    session_id char(128) UNIQUE NOT NULL,
    atime timestamp NOT NULL default current_timestamp,
    data text
);
转成gae中的表的写法就是
class isessions(db.Model):
    session_id = db.StringProperty(required=True, multiline=True)
    atime = db.DateTimeProperty(auto_now=True, auto_now_add=True)
    data = db.StringProperty(required=True, multiline=True, default='')
注意,data必须包含multiline=True属性,不然会出现BadValueError: Property data is not multi-line的错误

下面是修改DBStore的代码,实现用gae的方式对数据库进行增删改
class mystore(web.session.Store):
    def __init__(self):
        pass
    def __contains__(self, key):
        data = isessions.gql("where session_id=:p1", p1=key)
        return bool(list(data))
    def __getitem__(self, key):
        now = datetime.datetime.now()
        try:
            s = isessions.gql("where session_id=:p1", p1=key).get()
            if is_empty(s):
                pass
            else:
                s.atime = now
                s.put()
        except IndexError:
            raise KeyError
        else:
            return self.decode(s.data)
    def __setitem__(self, key, value):
        pickled = self.encode(value)
        now = datetime.datetime.now()
        if key in self:
            s = isessions.gql("where session_id=:p1", p1=key).get()
            s.data = pickled
        else:
            s = isessions(session_id=key, data=pickled)
        s.put()
    def __delitem__(self, key):
        s = isessions.gql("where session_id=:p1", p1=key).get()
        if is_empty(s):
            pass
        else:
            s.delete()
    def cleanup(self, timeout):
        timeout = datetime.timedelta(timeout/(24.0*60*60)) #timedelta takes numdays as arg
        last_allowed_time = datetime.datetime.now() - timeout
        ss = isessions.gql("where atime<:p1", p1=last_allowed_time).fetch(1000)
        for s in ss:
            s.delete()
效果可以在http://myiou1314.appspot.com 看到。左上角栏目下有一串白色的文字,就是session_id了,如果不能持久session,每次刷新页面,session_id都是会改变的。
Labels:   Web Server    Others    Python    gae  
Trackback:   http://cwq.iou1314.com/gae-session-python_a374
微博最近更新
[2010-07-31 16:33]    今天下午又将昨天赢的哎齐出来了,郁闷,一进一出,要有入没出才行啊。
[2010-07-31 07:40]    昨晚又去啊泄度开台,呢次赢左差唔多3旧水,下周星期一请假,回郁南去转社保和入党资料。
本站内的任何文章,只代表个人意见或学习所用,如有版权声明,请尊重作者的劳动成果,在转载时请保留原始链接并注明出处。
Power by David's PhpCms, © 2007 - 2010 CWQ.IOU1314.COM All Rights Reserved.