前两章讲了一些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
- try:
- 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"。