使用虛擬環境
創建虛擬環境:
$ virtualenv venv
可以通過下面的命令激活這個虛擬環境:
$ source venv/bin/activate
如果使用微軟 Windows 系統,激活命令是:$ venv\Scripts\activate
如果你想回到全局 Python 解釋器中,可以在命令行提示符下輸入 deactivate。
程序和請求上下文
Flask 在分發請求之前激活(或推送)程序和請求上下文,請求處理完成后再將其刪除。程序上下文被推送后,就可以在線程中使用 current_app 和 g 變量。類似地,請求上下文被推送后,就可以使用 request 和 session 變量。如果使用這些變量時我們沒有激活程序上下文或請求上下文,就會導致錯誤。
下面這個 Python shell 會話演示了程序上下文的使用方法:
>>> from hello import app
>>> from flask import current_app
>>> current_app.name
Traceback (most recent call last): ...
RuntimeError:working outside of application context
>>> app_ctx = app.app_context()
>>> app_ctx.push()
>>> current_app.name
'hello'
>>> app_ctx.pop()
在這個例子中,沒激活程序上下文之前就調用 current_app.name 會導致錯誤,但推送完上下文之后就可以調用了。注意,在程序實例上調用 app.app_context() 可獲得一個程序上下文。
請求鉤子
有時在處理請求之前或之后執行代碼會很有用。例如,在請求開始時,我們可能需要創建數據庫連接或者認證發起請求的用戶。為了避免在每個視圖函數中都使用重復的代碼,Flask 提供了注冊通用函數的功能,注冊的函數可在請求被分發到視圖函數之前或之后調用。
請求鉤子使用修飾器實現。Flask 支持以下 4 種鉤子。
- before_first_request:注冊一個函數,在處理第一個請求之前運行。
- before_request:注冊一個函數,在每次請求之前運行。
- after_request:注冊一個函數,如果沒有未處理的異常拋出,在每次請求之后運行。
- teardown_request:注冊一個函數,即使有未處理的異常拋出,也在每次請求之后運行。
在請求鉤子函數和視圖函數之間共享數據一般使用上下文全局變量 g。例如,before_request 處理程序可以從數據庫中加載已登錄用戶,并將其保存到 g.user 中。隨后調用視圖函數時,視圖函數再使用 g.user 獲取用戶。
響應
下述視圖函數返回一個 400 狀態碼,表示請求效:
@app.route('/')
def index():
return '<h1>Bad Request</h1>', 400
視圖函數返回的響應還可接受第三個參數,這是一個由首部(header)組成的字典,可以添加到 HTTP 響應中。
如果不想返回由 1 個、2 個或 3 個值組成的元組,Flask 視圖函數還可以返回 Response 對象。make_response() 函數可接受 1 個、2 個或 3 個參數(和視圖函數的返回值一樣),并返回一個 Response 對象。有時我們需要在視圖函數中進行這種轉換,然后在響應對象上調用各種方法,進一步設置響應。下例創建了一個響應對象,然后設置了 cookie:
from flask import make_response
@app.route('/')
def index():
response = make_response('<h1>This document carries a cookie!</h1>') response.set_cookie('answer', '42') return response
重定向響應
from flask import redirect
@app.route('/')
def index():
return redirect('http://www.example.com')
錯誤處理響應
abort函數
例如:
from flask import abort
@app.route('/user/<id>')
def get_user(id):
user = load_user(id)
if not user:
abort(404)
return '<h1>Hello, %s</h1>' % user.name
注意,abort 不會把控制權交還給調用它的函數,而是拋出異常把控制權交給 Web 服務器。