### 导航
- [索引](# "总目录")
- [下一页](# "步骤 5: 视图函数") |
- [上一页](# "步骤 3: 创建数据库") |
- [Flask 0.10.1 文档](#) »
- [教程](#) »
# 步骤 4: 请求数据库连接
现在我们知道如何在建立数据库连接并且如何执行脚本,但是我们如何能优雅的在请求中这么做?所有的函数都需要数据库连接,所以在请求之前初始化,在请求结束后自动关闭就很有意义。
Flask 允许我们用 [before_request()](# "flask.Flask.before_request") 、[after_request()](# "flask.Flask.after_request") 和 [teardown_request()](# "flask.Flask.teardown_request")装饰器来实现这个功能:
~~~
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
g.db.close()
~~~
用 [before_request()](# "flask.Flask.before_request") 装饰的函数会在请求前调用,它没有参数。用 [after_request()](# "flask.Flask.after_request") 装饰的函数在请求结束后调用,需要传入响应。它们必须返回那个响应对象或是不同的响应对象。但当异常抛出时,它们不一定会被执行,这时可以使用 [teardown_request()](# "flask.Flask.teardown_request") 装饰器,它装饰的函数将在响应构造后执行,并不允许修改请求,返回的值会被忽略。如果在请求已经被处理的时候抛出异常,它会被传递到每个函数,否则会传入一个 None 。
我们把当前的数据库连接保存在 Flask 提供的 [g](# "flask.g") 特殊对象中。这个对象只能保存一次请求的信息,并且在每个函数里都可用。不要用其它对象来保存信息,因为在多线程环境下将不可行。特殊的对象 [g](# "flask.g") 在后台有一些神奇的机制来保证它在做正确的事情。
继续 [*步骤 5: 视图函数*](#) 。
提示
我该把代码放在哪?
如果你一直遵循教程,你应该会问从这步到以后的步骤,代码放在什么地方。逻辑上应该按照模块来组织函数,即把你新的 before_request 和 teardown_request装饰的函数放在之前的 init_db 函数下面(逐行遵照教程)。
如果你需要一个时刻来找到你的方位,看一下 [示例源码](http://github.com/mitsuhiko/flask/tree/master/examples/flaskr/) [http://github.com/mitsuhiko/flask/tree/master/examples/flaskr/] 是怎么组织的。在Flask 中,你可以把你应用所有的代码放在一个 Python 模块里。但你无需这么做,并且在你的应用 [*规模扩大*](#) 的时候,这显然不妥。
© 版权所有 2013, Armin Ronacher.
- 欢迎使用 Flask
- 前言
- 给有经验程序员的前言
- 安装
- 快速入门
- 教程
- 介绍 Flaskr
- 步骤 0: 创建文件夹
- 步骤 1: 数据库模式
- 步骤 2: 应用设置代码
- 步骤 3: 创建数据库
- 步骤 4: 请求数据库连接
- 步骤 5: 视图函数
- 步骤 6: 模板
- 步骤 7: 添加样式
- 福利: 应用测试
- 模板
- 测试 Flask 应用
- 记录应用错误
- 配置处理
- 信号
- 即插视图
- 应用上下文
- 请求上下文
- 用蓝图实现模块化的应用
- Flask 扩展
- 与 Shell 共舞
- Flask 代码模式
- 大型应用
- 应用程序的工厂函数
- 应用调度
- 使用 URL 处理器
- 部署和分发
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上传文件
- 缓存
- 视图装饰器
- 使用 WTForms 进行表单验证
- 模板继承
- 消息闪现
- 用 jQuery 实现 Ajax
- 自定义错误页面
- 延迟加载视图
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 数据流
- 延迟请求回调
- 添加 HTTP Method Overrides
- 请求内容校验码
- 基于 Celery 的后台任务
- 部署选择
- mod_wsgi (Apache)
- 独立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的设计决策
- HTML/XHTML 常见问题
- 安全注意事项
- Flask 中的 Unicode
- Flask 扩展开发
- Pocoo 风格指引
- Python 3 支持
- 升级到最新版本
- Flask Changelog
- 许可证
- 术语表