笨鸟编程-零基础入门Pyhton教程

 找回密码
 立即注册

教程

发布者: 笨鸟自学网



步骤 3: 数据库连接

我们已经创建了一个能建立数据库连接的函数 connect_db ,但它本身并 不是很有用。总是创建或关闭数据库连接是相当低效的,所以我们会让连接 保持更长时间。因为数据库连接封装了事务,我们也需要确保同一时刻只有 一个请求使用这个连接。那么,如何用 Flask 优雅地实现呢?

这该是应用环境上场的时候了。那么,让我们开始吧。

Flask 提供了两种环境(Context):应用环境(Application Context)和 请求环境(Request Context)。暂且你所需了解的是,不同环境有不同的 特殊变量。例如 request 变量与当前请求的请求对象有关, 而 g 是与当前应用环境有关的通用变量。我们在之后会深 入了解它们。

现在你只需要知道可以安全地在 g 对象存储信息。

那么你何时把数据库连接存放到它上面?你可以写一个辅助函数。这个函数 首次调用的时候会为当前环境创建一个数据库连接,调用成功后返回已经建 立好的连接:

def get_db():
    """Opens a new database connection if there is none yet for the
    current application context.
    """
    if not hasattr(g, 'sqlite_db'):
        g.sqlite_db = connect_db()
    return g.sqlite_db

于是现在我们知道如何连接到数据库,但如何妥善断开连接呢?为此, Flask 提供了 teardown_appcontext() 装饰器。它将 在每次应用环境销毁时执行:

@app.teardown_appcontext
def close_db(error):
    """Closes the database again at the end of the request."""
    if hasattr(g, 'sqlite_db'):
        g.sqlite_db.close()

teardown_appcontext() 标记的函数会在每次应用环境 销毁时调用。这意味着什么?本质上,应用环境在请求传入前创建,每当请 求结束时销毁。销毁有两种原因:一切正常(错误参数会是 None )或发 生异常,后者情况中,错误会被传递给销毁时函数。

好奇这些环境的意义?阅读 应用上下文 文档了解更多。

阅读 步骤 4: 创建数据库 以继续。

提示

我该把这些代码放在哪?

如果你一直遵循教程,你应该会问从此以后的步骤产生的代码放在 什么地方。逻辑上来讲,应该按照模块来组织函数,即把你新的 get_db 和 close_db 函数放在之前的 connect_db 函数下面(逐行复刻教程)。

如果你需要来找准定位,可以看一下 示例源码 是怎么组织的。 在 Flask 中,你可以把你应用中所有的代码放在一个 Python 模块里。但你无需这么做,而且在你的应用 规模扩大 以后,这显然不妥。


步骤 4: 创建数据库

正如之前介绍的,Flaskr 是一个数据库驱动的应用,更准确的说法 是,一个由关系数据库系统驱动的应用。关系数据库系统需要一个模 式来决定存储信息的方式。所以在第一次开启服务器之前,要点是创 建模式。

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

sqlite3 /tmp/flaskr.db < schema.sql

这种方法的缺点是需要安装 sqlite3 命令,而并不是每个系统都有安 装。而且你必须提供数据库的路径,否则将报错。用函数来初始化数据 库是个不错的想法。

要这么做,我们可以创建一个名为 init_db 的函数来初始化数据库。 让我们首先看看代码。只需要把这个函数放在 flaskr.py 里的 connect_db 函数的后面:

def init_db():
    with app.app_context():
        db = get_db()
        with app.open_resource('schema.sql', mode='r') as f:
            db.cursor().executescript(f.read())
        db.commit()

那么,这段代码会发生什么?还记得吗?上个章节中提到,应用环境在 每次请求传入时创建。这里我们并没有请求,所以我们需要手动创建一 个应用环境。 g 在应用环境外无法获知它属于哪个应 用,因为可能会有多个应用同时存在。

with app.app_context() 语句为我们建立了应用环境。在 with 语句的内部, g 对象会与 app 关联。在语句的 结束处,会释放这个关联兵执行所有销毁函数。这意味着数据库连接在 提交后断开。

应用对象的 open_resource() 方法是一个很方便 的辅助函数,可以打开应用提供的资源。这个函数从资源所在位置( 你的 flaskr 文件夹)打开文件,并允许你读取它。我们在此用它来 在数据库连接上执行脚本。

SQLite 的数据库连接对象提供了一个游标对象。游标上有一个方法可 以执行完整的脚本。最后我们只需提交变更。SQLite 3 和其它支持事 务的数据库只会在你显式提交的时候提交。

现在可以在 Python shell 导入并调用这个函数来创建数据库:

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

故障排除

如果你遇到了表无法找到的异常,请检查你是否确实调用过 init_db 函数并且表的名称是正确的(比如弄混了单数和复数)。


上一篇:介绍 Flaskr下一篇:模板

Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )

GMT+8, 2024-9-8 13:06 , Processed in 0.020727 second(s), 17 queries .

© 2001-2020

返回顶部