在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):效果可以在http://myiou1314.appspot.com 看到。左上角栏目下有一串白色的文字,就是session_id了,如果不能持久session,每次刷新页面,session_id都是会改变的。
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()




















