前两章讲了一些sqlalchemy的基础使用,这一章要讲的就是在视图中调用sqlalchemy,同时这一章还要讲下web.py的类视图的一个使用技巧。
web.py支持中间件的设置,所以我们先写一个middleware.py来存放中间件。
middleware.py

# -*- coding: utf-8 -*-
from models import *
import web
def set_orm(handler):
    #获取sqlalchemy的session并存储到web.ctx.orm中
    web.ctx.orm = bindSQL()
    #执行视图,如果出现异常回滚数据库,正常结束则提交数据库操作,最终删除session
        return handler()
    except web.HTTPError:
        web.ctx.orm.rollback()
        raise
    except:
        web.ctx.orm.rollback()
        raise
    finally:
        web.ctx.orm.commit()
        web.ctx.orm.remove()
然后在main.py中添加中间件,并定义基类引入sqlalchemy的session,将main.py修改如下。
main.py
#-*- coding:utf-8 -*-
import web, middleware
from web.contrib.template import render_jinja
from models import *
urls = (
    "/", "index",
app = web.application(urls, globals())
app.add_processor(middleware.set_orm)
render = render_jinja(
    'templates',
    encoding = 'utf-8',
class BaseView(object):
    def __init__(self):
        #从web.ctx.orm获取session放入基类的db中
        self.db = web.ctx.orm
class index(BaseView):
    def GET(self):
        #查询user表并返回user的记录数
        query = self.db.query(User)
        return query.count()
if __name__ == "__main__":
    app.run()
这里也许你会觉得定义self.db没什么意义,但是在很多时候,我们要向第三方传递很多视图中的信息,这时候只要将self传递过去,就什么都有了。运行下main.py,如果你已经按照上一章完成了操作,那么在这里你会看到浏览器中输出"1"。