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