### 導航
- [索引](# "總目錄")
- [下一頁](# "步驟 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
- 許可證
- 術語表