flask(1):從hello World入門
一個簡單的flask應用:
一:初始化
from flask import Flask
app = Flask(__name__)
所有的flask程式都必須建立一個程式例項。上述程式碼中,app即為Flask類的一個例項。
web伺服器,使用一種名為web伺服器閘道器介面(web server gateway interface,WSGI)的協議,會將接收自客戶端的所有請求,轉交給這個物件來處理。
app.run() 執行
二:路由和檢視函式
客戶端將請求傳送給web伺服器後,伺服器會再將請求傳送給flask例項。
程式例項需要知道,每個URL要執行哪些程式碼,所以程式內部需要指定URL到函式的對映關係。
處理URL和函式之間關係的程式,稱為路由。
上述程式中,使用app.route裝飾器來註冊路由。這是定義路由最簡便的方式。
@app.route(path)
def function():
意為,當瀏覽器訪問的路徑為path時,執行function函式。例如,上述程式碼片段執行的結果是,當瀏覽器訪問根目錄時,執行helloWorld函式。
而helloWorld這樣的函式,被稱之為檢視函式。
注意:URL可以包含可變欄位,例如,針對不同使用者,可以有不同的個人主頁等。實現過程,除了在檢視函式中增加對應引數之外,還需在裝飾器中使用特殊語法。例如,對不同使用者,生成對應的歡迎資訊,程式碼修改如下:
同時還可以對該動態部分做限定,比如資料型別等。支援的資料型別有string,int,float,path等。
三:請求和響應
負責瀏覽器和web伺服器之間通訊的協議叫做http協議。http訊息用於交換伺服器和客戶端之間的資料。訊息有兩種型別:
客戶端傳送的請求
伺服器返回的響應
1:請求
app.url_map可以檢視flask程式中的URL對映。其中的HEAD,Options,GET是請求方法,是由對應路由進行處理的。
除了GET之外,還支援POST方法,GET用於請求資料,而POST用於提交資料。在路由中,可以指定methonds=['GET','POST']。
2:程式和請求上下文
在程式執行的過程中,需要讓檢視函式能夠訪問一些物件,以達到更好互動,完成特定功能。
如何處理這種場景呢?給檢視函式新增引數?各種可能處理的已知屬性都寫定?各種可能處理的未知屬性都用關鍵字引數佔位?這樣,未免冗餘繁雜。
flask對於該場景的設計機制是,分別提供一種叫做程式上下文和請求上下文的東西。
上下文,在漢語中的意思是,語意,語境,一定長度的文字或內容。
而flask中的程式上下文或請求上下文,意義更為確定,是指:在一個請求(程式)中,特定屬性被暫時當做全域性變數,不用定義便可使用,請求(程式)結束,變數銷燬。
舉例:兩個人同時訪問網頁,發起兩個不同的請求,各自將資訊儲存到session中。如果這時,設定了session是全域性變數,那麼同時發起的兩個請求,一定會有一個session被覆蓋。而如果不設定為全域性變數,程式碼中必然無盡的傳遞session。
而採用上下文之後,可以理解為,兩個請求之間做了隔離,每個人的請求中,對應著自己單獨的session,互不影響,並且在整個請求的生命週期內,都可以使用。
3:請求鉤子
有時需要在處理請求之前或之後執行某部分程式碼,比如,在需要在資料庫連線之前建立連線使用者。
為避免在每個檢視函式中使用重複的程式碼,flask提供了註冊通用函式的功能,註冊的函式可以在請求被分發到檢視函式之前或之後呼叫。
請求鉤子使用裝飾器實現,flask支援一下四種鉤子:
before_first_request 在請求第一個請求前執行
before_request 在每次請求前執行 如果在某修飾的函式中返回了一個響應,檢視函式將不再被呼叫
after_request 如果沒有丟擲錯誤,在每次請求後執行
teardown_request 在每次請求後執行
4:響應
flask呼叫檢視函式後,會將其返回值作為響應的內容。比如,上述示例程式碼中,return後即為返回的內容。
除了這些內容,響應中還有一個很重要的東西叫做狀態碼,例如,我們有時候訪問頁面看到的404或500.
以下是常見的狀態碼:
預設200,請求成功處理
2xx成功:200(請求成功處理)、204(請求成功處理但無資源返回)、206(請求部分內容成功,在請求報文實體首部中包含需要的資源)
3xx重定向:301(永久性重定向,表示訪問資源已經更新了URI,通常在返回報文首部資訊增加Location提示新的URI,如果訪問的URI儲存為書籤,則會被更新為新的URI)
302(臨時性重定向,表示此次訪問資源被重定向到新的URI,並非永久,不更新書籤)
304(資源不滿足客戶端請求條件,比如請求的是某時間點後有更新則返回新資源,但資源在該時間點後無更新,被規在3xx,但和重定向沒啥關係)
4xx客戶端錯誤:400(客戶端請求存在錯誤,應該修改請求後再次傳送)、401(未授權)、403(禁止訪問)、404(找不到訪問的資源)
5xx伺服器錯誤:500(伺服器處理請求時出現錯誤)、503(伺服器忙碌或者停機維護無法處理請求)
除了直接return一些HTML標籤之外,還有其他的響應方式。
render_template:渲染並返回一個html檔案
redirect:重定向到一個URL
abort:錯誤處理