當前位置:編程學習大全網 - 源碼下載 - Flask視圖:視圖函數,類視圖,藍圖使用方法整理

Flask視圖:視圖函數,類視圖,藍圖使用方法整理

摘要: Flask , 視圖 , 視圖函數 , 類視圖 , 方法視圖 , 裝飾器 , 藍圖

在Flask中 路由 是指用戶請求的 URL 與 視圖函數 之間的 映射 ,處理URL和函數之間關系的程序稱為路由。Flask根據HTTP請求的URL在路由表中匹配預定義的URL找到對應的視圖函數。將視圖函數的執行結果返回給服務器。

Flask中默認使用 @app.route 裝飾器將視圖函數和URL綁定,裝飾器是壹種接受函數的函數,返回新的函數。

使用裝飾器將視圖函數page和url '/'關系綁定帶 app.url_map 屬性上,打印app.url_map的結果如下,有兩條url規則,分別是根目錄下的URL規則和static目錄下的URL規則

可以給裝飾器增加 endpoint 參數給 url命名 ,壹旦使用了endpoint參數 url_for 反轉就不能使用視圖函數名了而要使用定義的url名。

url_for('index')的輸出是字符串格式url的內容"/"

也可以不使用裝飾器,使用 add_url_rule 將視圖函數和url綁定,裝飾器 @app.route 實際是調用的 add_url_rule 方法

視圖函數也可以結合類來實現,類視圖的好處是支持 繼承 ,可以將***性的東西放到父類中,類視圖需要使用 app.add_url_rule() 來進行註冊,類視圖分為 標準類視圖 和 基於調度方法的類視圖

標準類視圖有標準的寫法

使用類視圖,在父類中定義壹個屬性,在子類中完成各自的業務邏輯,同時都繼承父類中的這壹個屬性

分別定義三個子類的模板

查看結果,三個url的返回除了三個模板各自的內容外都需要輸出父類的ads屬性

如果同壹個視圖函數需要根據 不同的請求方式 進行不壹樣的邏輯處理,需要在視圖函數內部進行判斷,可以使用 方法類視圖 實現,使用類繼承 flask.views.MethodView ,定義和請求方式 同名的小寫方法 來完成了邏輯處理。

編輯壹個頁面直接訪問是輸出用戶名密碼頁面,提交表單後是密碼正確與否的提示。

在html中定義 form 標簽action屬性關聯url名

如果不用方法視圖實現需要在普通視圖內部調用 request.method 判斷是否為 GET , POST 進行判斷

裝飾器的本質是壹個Python函數, 接受壹個函數 , 返回壹個函數 ,目的是讓壹個函數獲得 其他額外的功能 。

假設壹個場景訪問新聞詳情頁又壹個函數實現,但是之前必須先登錄,登錄由另壹個函數實現,此時需要將訪問新聞函數傳遞給登錄函數返回壹個新的函數作為整體的邏輯實現,這個給登錄函數增加新功能瀏覽網頁的過程就是裝飾器。

控制臺輸出,new_func()執行了新函數,基礎函數user_login執行了新加入的功能,新函數真實的函數名還是inner

如果使用裝飾器魔法符號實現,此時直接調用被裝飾的函數即可實現帶有新功能的基礎函數,函數作為參數傳入的過程已經自動實現

在基礎函數和要包裝的函數上都支持傳遞參數

查看 app.route() 的源碼內部也是將視圖函數包裝,在原函數執行之前調用 add_url_rule 綁定url,endpoint和視圖函數的關系,再返回原函數實現業務邏輯

藍圖的目的是實現 各個模塊的視圖函數寫在不同的py文件中 ,在主視圖中導入分路由視圖的模塊,並註冊藍圖對象, 降低各個功能模塊的耦合度 ,使用 flask.Blueprint 定義藍圖, app.register_blueprint 註冊藍圖。

實現主頁,詳情頁,對比頁三個頁面,在主頁中導入兩個其他功能頁,先編寫兩個功能頁的藍圖detail.py和compare.py

使用 app = Blueprint('detail', __name__) 定義藍圖對象, detail 是藍圖名,藍圖名不能重復。再編寫主視圖main.py,在主視圖中註冊之前的藍圖,其他視圖函數的名字不能和藍圖名壹致

查看效果

如果在藍圖的py腳本中調用了 url_for ,需要把藍圖的name(就是 name 之前的)也加入作為前綴,如下

  • 上一篇:如何在數字系統上進行深度應用,如IOT、BIM、GIS等。,被稱為“深度”應用?
  • 下一篇:德國奶粉哪個牌子好?
  • copyright 2024編程學習大全網