前言
用了一段时间的web.py,非常好用,所以打算整理一下一些在web.py里的应用,方便自己需要时查找,也让有兴趣的朋友能一同学习,如果大家觉得文章有什么问题,请指出来,我也能及时修改自己的错误。
在此悼念下web.py的作者...
正文
好了,现在开始正文。刚开始用web.py做开发的时候,我使用的是DiskStore,一开始感觉没什么问题,可是后来在使用uwsgi的时候,发现时不时会出现错误,所以决定改用DBStore,由于我数据库的orm使用的是sqlalchemy,所以就把DBStore重写了下,下面是sqlalchemy的表的定义:
class WebpySession(Base):
__tablename__ = "sessions"
session_id = Column(CHAR(128), nullable=False, unique=True, primary_key=True)
atime = Column(DateTime, default=datetime.datetime.now())
data = Column(Text, nullable=True)
接下来是重写的DBStore:
DBStore.py
#-*- coding: utf-8 -*-
import datetime
import web, models
class SQLAStore(web.session.Store):
def __init__(self, table):
self.table = table
self.session = models.bindSQL()
def __contains__(self, key):
query = self.session.query(self.table).filter(self.table.session_id==key).first()
return bool(query)
def __getitem__(self, key):
s = self.session.query(self.table).filter(self.table.session_id==key).first()
if not s:
raise KeyError
else:
s.atime = datetime.datetime.now()
self.session.commit()
return self.decode(s.data)
def __setitem__(self, key, value):
pickled = self.encode(value)
now = datetime.datetime.now()
if key in self:
query = self.session.query(self.table).filter(self.table.session_id==key).first()
query.data = pickled
query.atime = now
else:
query = self.table(session_id=key, data=pickled)
self.session.add(query)
self.session.commit()
def __delitem__(self, key):
self.session.query(self.table).filter(self.table.session_id==key).delete()
self.session.commit()
def cleanup(self, timeout):
timeout = datetime.timedelta(timeout/(24.0*60*60)) #timedelta takes numdays as arg
last_allowed_time = datetime.datetime.now() - timeout
self.session.query(self.table).filter(self.table.atime < last_allowed_time).delete()
self.session.commit()
最后是在main.py中调用
if web.config.get('_session') is None:
session = web.session.Session(app, DBStore.SQLAStore(WebpySession))
web.config._session = session
else:
session = web.config._session
其他的使用与DiskStore没什么区别,如果使用的是别的调用session的方式,可以根据实际情况重写DBStore来实现
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)