Python Flask Web框架(八)

一、创建数据库

如前面所述,Flaskr 是一个数据库驱动的应用程序,准确地来说,Flaskr 是一个使用关系数据库系统的应用程序。 这样的系统需要一个模式告诉它们如何存储信息。因此在首次启动服务器之前,创建数据库模式是很重要的。

可以通过管道把 schema.sql 作为 sqlite 3 命令的输入来创建这个模式,命令如下:

sqlite3 /tmp/flaskr.db < schema.sql

这种方法的缺点是需要安装 sqlite 3 命令,而并不是每个系统都有安装(实验楼的系统就没有安装)。而且你必须提供数据库的路径,否则将报错。添加一个函数来对初始化数据库是个不错的想法。

如果你想要这么做,首先你必须从contextlib包中导入contextlib.closing()函数。如果你要使用 Python 2.5 有必要先启用 with声明( __future__导入必须先于其它的导入),修改flaskr文件如下:

from __future__ import with_statement
from contextlib import closing

接着我们可以创建一个称为 init_db 函数,该函数用来初始化数据库。为此我们可以使用之前定义的 connect_db 函数。 只要在 connect_db 函数下添加这样的函数:

def init_db():
    with closing(connect_db()) as db:
        with app.open_resource('schema.sql') as f:
            db.cursor().executescript(f.read())
        db.commit()

closing()函数允许我们在with块中保持数据库连接可用。应用对象的open_resource()方法在其方框外也支持这个功能,因此可以在with块中直接使用。这个函数从当前位置(你的flaskr 文件夹)中打开一个文件,并且允许你读取它。我们在这里用它在数据库连接上执行一个脚本。

当我们连接到数据库时会得到一个数据库连接对象(这里命名它为 db),这个对象提供给我们一个数据库指针。指针上有一个可以执行完整脚本的方法。最后我们不显式地提交更改, SQLite 3 或者其它事务数据库不会这么做。

现在可以在 Python shell 里创建数据库,导入并调用刚才的函数:

>>> from flaskr import init_db
>>> init_db()

注意:

如果你后面得到一个表不能找到的异常,请检查你是否调用了 init_db 函数以及你的表名是否正确 (例如: singular vs. plural)。

二、请求数据库连接

现在我们知道了怎样建立数据库连接以及在脚本中使用这些连接,但是我们如何能优雅地在请求中这么做?

所有我们的函数中需要数据库连接,因此在请求之前初始化它们,在请求结束后自动关闭他们就很有意义。

Flask 允许我们使用before_request()after_request()和 teardown_request()装饰器来实现这个功能:

@app.before_request
def before_request():
    g.db = connect_db()

@app.teardown_request
def teardown_request(exception):
    g.db.close()

使用before_request()装饰器的函数会在请求之前被调用而且不带参数。使用after_request()装饰器的函数会在请求之后被调用且传入将要发给客户端的响应。

它们必须返回那个响应对象或是不同的响应对象。但当异常抛出时,它们不一定会被执行,这时可以使用teardown_request()装饰器。它装饰的函数将在响应构造后执行,并不允许修改请求,返回的值会被忽略。如果在请求已经被处理的时候抛出异常,它会被传递到每个函数,否则会传入一个None

我们把当前的数据库连接保存在 Flask 提供的 g 特殊对象中。这个对象只能保存一次请求的信息, 并且在每个函数里都可用。不要用其它对象来保存信息,因为在多线程环境下将不可行。特殊的对象 g 在后台有一些神奇的机制来保证它在做正确的事情。

二、小结

本节创建项目所需要的数据库,并了解before_requestafter_requestteardown_request装饰器。

三、练习

请参照本文创建好数据库,并测试是否成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值