1. 程式人生 > >flask(1):從hello World入門

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:錯誤處理