天天看點

Flask Web開發入門筆記(二)

1 Flask開啟調試模式

Flask 應用可以在調試模式中運作。在這個模式下,開發伺服器預設會加載兩個便利的工具:重載器和調試器。

啟用重載器後, Flask 會監視項目中的所有源碼檔案,發現變動時自動重新開機伺服器。在開發過程中運作啟動重載器的伺服器特别友善,因為每次修改并儲存源碼檔案後,伺服器都會自動重新開機,讓改動生效。

調試器是一個基于 Web 的工具,當應用抛出未處理的異常時,它會出現在浏覽器中。此時, Web 浏覽器變成一個互動式棧跟蹤,你可以在裡面審查源碼,在調用棧的任何位置計算表達式。

Flask Web開發入門筆記(二)
調試模式預設禁用。若想啟用,在執行 flask run 指令之前設定

FLASK_DEBUG=1

環境變量:

(venv) $ export FLASK_APP=hello.py
(venv) $ export FLASK_DEBUG=1
(venv) $ flask run
* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528
           

注意:

當使用 app.run() 方法啟動伺服器時,不會用到 FLASK_APP 和 FLASK_DEBUG 環境變量。若想以程式設計的方式啟動調試模式,就使用

app.run(debug=True)

2 應用和請求上下文

Flask從用戶端收到請求時,要讓視圖函數能通路一些對象,這樣才能處理請求。請求對象就是一個很好的例子,它封裝了用戶端發送的HTTP 請求。

要想讓視圖函數能夠通路請求對象,一種直截了當的方式是将其作為參數傳入視圖函數,不過這會導緻應用中的每個視圖函數都多出一個參數。除了通路請求對象,如果視圖函數在處理請求時還要通路其他對象,情況會變得更糟。

為了避免大量可有可無的參數把視圖函數弄得一團糟, Flask 使用上下文臨時把某些對象變為全局可通路。有了上下文,便可以像下面這樣編寫視圖函數:

from flask import request
@app.route('/')
def index():
    user_agent = request.headers.get('User-Agent')
    return '<p>Your browser is {}</p>'.format(user_agent)
           

注意,在這個視圖函數中我們把 request 當作全局變量使用。事實上, request 不可能是全局變量。試想,在多線程伺服器中,多個線程同時處理不同用戶端發送的不同請求時,每個線程看到的 request 對象必然不同。 Flask 使用上下文讓特定的變量在一個線程中全局可通路,與此同時卻不會幹擾其他線程。

在 Flask 中有兩種上下文: 應用上下文和請求上下文。下表 列出了這兩種上下文提供的變量。

變量名 上下文 說明
current_app 應用上下文 目前應用的應用執行個體
g 處理請求時用作臨時存儲的對象,每次請求都會重設這個變量
request 請求上下文 請求對象,封裝了用戶端發出的 HTTP 請求中的内容
session 使用者會話,值為一個字典,存儲請求之間需要“記住”的值
>>> 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()