web.py+sqlalchemy的session DBStore

本文介绍了如何在web.py应用中使用sqlalchemy的session替代DiskStore,以解决在uwsgi环境下出现的问题。作者提供了sqlalchemy表的定义,并展示了在main.py中的调用方式。
摘要由CSDN通过智能技术生成

前言

用了一段时间的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来实现 微笑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值