Flask學習筆記-程序的基本結構

使用虛擬環境

創建虛擬環境:
$ 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 服務器。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容