Flask從入門到精通之flask程式入門

2022-03-28 03:38:48 字數 4061 閱讀 5827

所有flask程式都必須建立乙個程式例項,web伺服器使用一種名為web伺服器閘道器介面的的協議(wsgi),把接收自客戶端的所有請求**給這個物件處理。程式例項是flask類的物件,使用下面**構建

from flask import flask
flask類的建構函式只有乙個必須指定的引數,即程式主模組或則包的名稱。。在大多數程式中,python 的__name__ 變數就是所需的值。將建構函式的name 引數傳給flask 程式,這一點可能會讓flask 開發新手心生迷惑。flask 用這個引數決定程式的根目錄,以便稍後能夠找到相對於程式根目錄的資源檔案位置。

客戶端把請求**給web伺服器,web伺服器再把請求傳送給flask程式例項。程式例項需要知道對於每個url請求,執行哪些**,所以儲存乙個url請求到python函式的對映關係。處理url和函式對映關係的程式稱為路由。

def index():

return ""

前例把index() 函式註冊為程式根位址的處理程式。如果部署程式的伺服器網域名稱為www.example.com,在瀏覽器中訪問 後,會觸發伺服器執行index() 函式。這個函式的返回值叫做響應,是客戶端接收到的內容。像index這樣的函式稱為檢視函式。檢視函式的返回的響應可以是簡單的html,也可以是複雜的表單。

如果你仔細觀察日常所用服務的某些url 格式,會發現很多位址中都包含可變部分,flask 支援這種形式的url,只需在route 修飾器中使用特殊的句法即可。下例定義的路由中就有一部分是動態名字

def index(name):

return "" % name

路由中的動態部分預設使用字串,不過也可使用型別定義。例如,路由/user/int:id只會匹配動態片段id 為整數的url。flask 支援在路由中使用int、float 和path 型別。path 型別也是字串,但不把斜線視作分隔符,而將其當作動態片段的一部分。

程式例項用run 方法啟動flask 整合的開發web 伺服器:

if __name == '___main_':
伺服器啟動後,會進入輪詢,等待並處理請求。輪詢會一直執行,直到程式停止,比如按ctrl-c 鍵

前幾節介紹了flask web 程式的不同組成部分,現在是時候開發乙個程式了。整個hello.py程式指令碼就是把前面介紹的三部分合併到乙個檔案中。

from flask import flask

def index():

return ''

if __name__ == '__main__':

之後啟用虛擬環境,然後執行python hello.py,列印一下日誌

* running on  (press ctrl+c to quit)

* restarting with stat

* debugger is active!

* debugger pin: 240-501-696

在瀏覽器輸入,可以看到結果輸出。

下面介紹一下flask框架的設計理念

flask 從客戶端收到請求時,要讓檢視函式能訪問一些物件,這樣才能處理請求。請求物件就是乙個很好的例子,它封裝了客戶端傳送的http 請求。要想讓檢視函式能夠訪問請求物件,乙個顯而易見的方式是將其作為引數傳入檢視函式,不過這會導致程式中的每個檢視函式都增加乙個引數。除了訪問請求物件,如果檢視函式在處理請求時還要訪問其他物件,情況會變得更糟.為了避免大量可有可無的引數把檢視函式弄得一團糟,flask 使用上下文臨時把某些物件

變為全域性可訪問。有了上下文,就可以寫出下面的檢視函式:

from flask import request

def index():

user_agent=request.headers.get('user_agent')

return 'your browser is %s

' % user_agent

注意在這個檢視函式中我們如何把request 當作全域性變數使用。事實上,request 不可能是全域性變數。試想,在多執行緒伺服器中,多個執行緒同時處理不同客戶端傳送的不同請求時,每個執行緒看到的request 物件必然不同。falsk 使用上下文讓特定的變數在乙個執行緒中全域性可訪問,與此同時卻不會干擾其他線。

在flask 中有兩種上下文:程式上下文和請求上下文:

請求上下文

要想檢視flask 程式中的url 對映是什麼樣子,我們可以在python shell 中檢查為hello.py生成的對映。測試之前,請確保你啟用了虛擬環境。

map([index>,

' (head, options, get) -> static>])

>>>

url 對映中的head、options、get 是請求方法,由路由進行處理。flask 為每個路由都指定了請求方法,這樣不同的請求方法傳送到相同的url 上時,會使用不同的檢視函式進行處理。head 和options 方法由flask 自動處理,因此可以這麼說,在這個程式中,url對映中的3 個路由都使用get 方法。

有時在處理請求之前或之後執行**會很有用。例如,在請求開始時,我們可能需要建立資料庫連線或者認證發起請求的使用者。為了避免在每個檢視函式中都使用重複的**,flask 提供了註冊通用函式的功能,註冊的函式可在請求被分發到檢視函式之前或之後呼叫。flask支援一下四種鉤子:

在請求鉤子函式和檢視函式之間共享資料一般使用上下文全域性變數g。例如,before_request 處理程式可以從資料庫中載入已登入使用者,並將其儲存到g.user 中。隨後呼叫檢視函式時,檢視函式再使用g.user 獲取使用者,鉤子的具體用法會在後面詳細介紹。

flask 呼叫檢視函式後,會將其返回值作為響應的內容。大多數情況下,響應就是乙個簡單的字串,作為html 頁面回送客戶端。但http 協議需要的不僅是作為請求響應的字串。http 響應中乙個很重要的部分是狀態碼,flask 預設設為200,這個**表明請求已經被成功處理。

如果檢視函式返回的響應需要使用不同的狀態碼,那麼可以把數字**作為第二個返回值,新增到響應文字之後。例如,下述檢視函式返回乙個400 狀態碼,表示請求無效

def index():

return 'bad request

',400

檢視函式返回的響應還可接受第三個引數,這是乙個由首部(header)組成的字典,可以新增到http 響應中。如果不想返回由1 個、2 個或3 個值組成的元組,flask 檢視函式還可以返回response 物件。make_response() 函式可接受1 個、2 個或3 個引數(和檢視函式的返回值一樣),並返回乙個response 物件。有時我們需要在檢視函式中進行這種轉換,然後在響應物件上呼叫各種方法,進一步設定響應。下例建立了乙個響應物件,然後設定了cookie:

from flask import make_response

def index():

response = make_response('')

response.set_cookie('answer', '42')

return response

有一種名為重定向的特殊響應型別。這種響應沒有頁面文件,只告訴瀏覽器乙個新位址用以載入新頁面.重定向經常使用302 狀態碼表示,指向的位址由location 首部提供。重定向響應可以使用3 個值形式的返回值生成,也可在response 物件中設定。不過,由於使用頻繁,flask 提供了redirect() 輔助函式,用於生成這種響應:

from flask import redirect

def index():

return redirect('')

還有一種特殊的響應由abort 函式生成,用於處理錯誤。在下面這個例子中,如果url 中動態引數id 對應的使用者不存在,就返回狀態碼404:

from flask import abort

def get_user(id):

user = load_user(id)

if not user:

abort(404)

return '' % user.name

注意,abort 不會把控制權交還給呼叫它的函式,而是丟擲異常把控制權交給web 伺服器

Flask從入門到精通之flask擴充套件

flask被設計成可擴充套件形式,因此並沒有提供一些重要的功能,比如資料庫和使用者認證,所以開發者可以自由選擇最適合程式的包,或者按需求自行開發。社群成員開發了大量不同用途的擴充套件,如果這還不能滿足需求,你還可使用所有python 標準包或 庫。為了讓你知道如何把擴充套件整合到程式中,接下來我們將...

Flask從入門到精通之flask安裝

安裝flask最簡單的方式是使用虛擬環境,虛擬環境是python直譯器的乙個私有副本,在這個環境中你可以安裝私有包,而且不會影響系統中安裝的全域性的python直譯器。虛擬環境非常有用,可以在系統的python 直譯器中避免包的混亂和版本的衝突。為每個程式單獨建立虛擬環境可以保證程式只能訪問虛擬環境...

Flask從入門到精通之鏈結的使用

在web開發中,任何具有多個路由的程式都需要可以連線不同頁面的鏈結,例如導航條。在模板中直接編寫簡單路由的url 鏈結不難,但對於包含可變部分的動態路由,在模板中構建正確的url 就很困難。而且,直接編寫url 會對 中定義的路由產生不必要的依賴關係。如果重新定義路由,模板中的鏈結可能會失效。為了避...