步骤4:数据库连接¶
我们已经创建了一个能建立数据库连接的函数 connect_db ,但它本身并 不是很有用。 总是创建或关闭数据库连接是相当低效的,所以我们会让连接 保持更长时间。 因为数据库连接封装了事务,我们也需要确保同一时刻只有 一个请求使用这个连接。 实现这一点的一个优雅的方式是利用应用的上下文。
Flask提供了两种上下文:应用上下文和请求上下文。暂且,你只需要知道不同上下文有不同的特殊变量。例如,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
)或发生异常,后者情况中,错误会被传递给销毁时函数。
好奇这些环境的意义? 阅读 应用上下文 文档了解更多。
阅读步骤5:创建数据库以继续。