使用虛擬環(huán)境
創(chuàng)建虛擬環(huán)境:
$ virtualenv venv
可以通過下面的命令激活這個(gè)虛擬環(huán)境:
$ source venv/bin/activate
如果使用微軟 Windows 系統(tǒng),激活命令是:$ venv\Scripts\activate
如果你想回到全局 Python 解釋器中,可以在命令行提示符下輸入 deactivate鳍刷。
程序和請(qǐng)求上下文
Flask 在分發(fā)請(qǐng)求之前激活(或推送)程序和請(qǐng)求上下文,請(qǐng)求處理完成后再將其刪除码耐。程序上下文被推送后,就可以在線程中使用 current_app 和 g 變量。類似地,請(qǐng)求上下文被推送后,就可以使用 request 和 session 變量檀夹。如果使用這些變量時(shí)我們沒有激活程序上下文或請(qǐng)求上下文,就會(huì)導(dǎo)致錯(cuò)誤策橘。
下面這個(gè) Python shell 會(huì)話演示了程序上下文的使用方法:
>>> 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()
在這個(gè)例子中,沒激活程序上下文之前就調(diào)用 current_app.name 會(huì)導(dǎo)致錯(cuò)誤,但推送完上下文之后就可以調(diào)用了。注意,在程序?qū)嵗险{(diào)用 app.app_context() 可獲得一個(gè)程序上下文丽已。
請(qǐng)求鉤子
有時(shí)在處理請(qǐng)求之前或之后執(zhí)行代碼會(huì)很有用。例如,在請(qǐng)求開始時(shí),我們可能需要?jiǎng)?chuàng)建數(shù)據(jù)庫連接或者認(rèn)證發(fā)起請(qǐng)求的用戶沛婴。為了避免在每個(gè)視圖函數(shù)中都使用重復(fù)的代碼,Flask 提供了注冊(cè)通用函數(shù)的功能,注冊(cè)的函數(shù)可在請(qǐng)求被分發(fā)到視圖函數(shù)之前或之后調(diào)用。
請(qǐng)求鉤子使用修飾器實(shí)現(xiàn)嘁灯。Flask 支持以下 4 種鉤子泻蚊。
- before_first_request:注冊(cè)一個(gè)函數(shù),在處理第一個(gè)請(qǐng)求之前運(yùn)行丑婿。
- before_request:注冊(cè)一個(gè)函數(shù),在每次請(qǐng)求之前運(yùn)行没卸。
- after_request:注冊(cè)一個(gè)函數(shù),如果沒有未處理的異常拋出,在每次請(qǐng)求之后運(yùn)行。
- teardown_request:注冊(cè)一個(gè)函數(shù),即使有未處理的異常拋出,也在每次請(qǐng)求之后運(yùn)行秒旋。
在請(qǐng)求鉤子函數(shù)和視圖函數(shù)之間共享數(shù)據(jù)一般使用上下文全局變量 g。例如,before_request 處理程序可以從數(shù)據(jù)庫中加載已登錄用戶,并將其保存到 g.user 中迁筛。隨后調(diào)用視圖函數(shù)時(shí),視圖函數(shù)再使用 g.user 獲取用戶煤蚌。
響應(yīng)
下述視圖函數(shù)返回一個(gè) 400 狀態(tài)碼,表示請(qǐng)求效:
@app.route('/')
def index():
return '<h1>Bad Request</h1>', 400
視圖函數(shù)返回的響應(yīng)還可接受第三個(gè)參數(shù),這是一個(gè)由首部(header)組成的字典,可以添加到 HTTP 響應(yīng)中。
如果不想返回由 1 個(gè)细卧、2 個(gè)或 3 個(gè)值組成的元組,Flask 視圖函數(shù)還可以返回 Response 對(duì)象铺然。make_response() 函數(shù)可接受 1 個(gè)、2 個(gè)或 3 個(gè)參數(shù)(和視圖函數(shù)的返回值一樣),并返回一個(gè) Response 對(duì)象酒甸。有時(shí)我們需要在視圖函數(shù)中進(jìn)行這種轉(zhuǎn)換,然后在響應(yīng)對(duì)象上調(diào)用各種方法,進(jìn)一步設(shè)置響應(yīng)魄健。下例創(chuàng)建了一個(gè)響應(yīng)對(duì)象,然后設(shè)置了 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
重定向響應(yīng)
from flask import redirect
@app.route('/')
def index():
return redirect('http://www.example.com')
錯(cuò)誤處理響應(yīng)
abort函數(shù)
例如:
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 不會(huì)把控制權(quán)交還給調(diào)用它的函數(shù),而是拋出異常把控制權(quán)交給 Web 服務(wù)器。