Flask路由與藍圖Blueprint

来源:https://www.cnblogs.com/thomson-fred/archive/2018/12/12/10106303.html
-Advertisement-
Play Games

需求分析: 當一個龐大的系統中有很多小模塊,在分配路由的時候怎麼處理呢?全部都堆到一個py程式中,調用@app.route? 顯然這是很不明智的,因為當有幾十個模塊需要寫路由的時候,這樣程式員寫著寫著自己就暈掉了。同時也違背了面向對象設計原則中的控制反轉原則。模塊與模塊之間應該不要太緊密的依賴,高級 ...


需求分析:

當一個龐大的系統中有很多小模塊,在分配路由的時候怎麼處理呢?全部都堆到一個py程式中,調用@app.route? 顯然這是很不明智的,因為當有幾十個模塊需要寫路由的時候,這樣程式員寫著寫著自己就暈掉了。同時也違背了面向對象設計原則中的控制反轉原則。模塊與模塊之間應該不要太緊密的依賴,高級層級模塊和低級層級的模塊之間的依賴應該有一層抽象來實現。

 

Flask框架中,我們可以使用blueprint藍圖來解耦路由分配問題,實現不同業務模塊之間的較為鬆散的依賴。

1. blueprint的實現過程

(1)在子模塊views.py文件中定義藍圖

例如:為customer定義一個藍圖路由

customer = Blueprint('customer',__name__)

@customer.route()

   def  do_something():

       pass

 

(2)在主模塊views.py文件中註冊藍圖

app.register_blueprint(customer,url_prefix='/customer')

 

Blueprint()函數解析,Blueprint實際上是一個類

官方文檔的定義:

def __init__(self, name, import_name, static_folder=None,
                 static_url_path=None, template_folder=None,
                 url_prefix=None, subdomain=None, url_defaults=None,
                 root_path=None):

有兩個是必須填寫的參數:name和import name,其餘參數都是選擇性的

1. name:即路由的別名,在子模塊中定義的藍圖要想通過在主模塊中註冊使用,就需要定義一個別名

2. import name:表示模塊的系統變數,用來區別是子模塊還是主模塊,這裡必須填__name__,表示是在子模塊中定義

 

3. url_prefix:路由首碼

例如:想到達http://myblog/article/first

/artile  即是 first首碼

 

4. template_folder:模板文件夾

如果想從其他模塊的模板文件夾中調度模板來使用,需要使用template_folder來指明模板的搜尋路徑

同樣的,static_folder與static_url_path的功能與template_folder類似

 

5. url_defaults :預設的路由路徑別名,以字典的形式保存在Blueprint類實例中。

因為保存的形式是字典,所以這個參數的值比較特殊,一定是要含有兩個參數的元組形式。

例如:url_defaults=([‘so’,’so’])

 

有一種參數形式的路由設定方式:

@customer.route(‘/<int : any>’)

def do_something(any):

   pass

 

路由參數在客戶端輸入的值時不確定的,如上面規定的int即整型數(也可以是string類型或者不設定類型)。在定義路由函數的時候,必須作為形參傳入。那麼如果設定了url_defaluts,則這個形參的名稱就固定了,不可以為其他。例如上面的例子:url_defaults=([‘so’,’so’]),那麼,形參就必須為so,而不能是any了。顯然,blueprint的這個參數能夠有效定義路由的具體功能,使一個路由更具體化,避免程式編寫過程中隨意的改動造成錯誤。

 

也就是說,一旦設定了這個參數值,那麼這個路由的別名就定死了。

 

6. root_path:根目錄的絕對路徑,一般為工程項目的根目錄路徑

 

 

2. 關於route方法

例子:

@app.route(‘ /’ ,’index’ , index)  

def index():

   pass

#帶引號的是endpoint,不帶引號的index是路由函數名,必須要與下麵定義的函數名相同

 

route()其實是add_url_rule()方法的實例

@app.route(‘ /’ ,’index’,index)

等價於:app.add_url_rule(‘/’,’index’, index)

也可以這樣定義endpoint:

app.view_functions[‘index’] = index

 

官方源碼:

add_url_rule(rule,endpoint=None,view_func=None,provide_automatic_options=None, **options)

參數解析:

1. rule:在瀏覽器輸入的地址格式

2. view_func:路由函數,即開發者定義的路由

If a view_func is provided it will be registered with the endpoint.

3. endpoint:路由函數的註冊別名

 

關於endpoint

endpoint相當於實際url的一個別名,在瀏覽器輸入地址時,需要在flask後臺尋找相應的路由函數(從而查找相應的資源),而在查找的過程中,不是直接用物理地址來進行硬編碼的,而是通過映射成endpoint來查找。也就是說,開發者定義的每一個路由地址都有一個註冊的endpoint與之對應。在客戶端輸入地址在後臺查詢資源的時候,通過這個endpoint來查找相應的路由函數。

 

 

深入理解Flask請求機制:

所有 Flask 程式都必須創建一個程式實例。 Web 伺服器把接收來自客戶端的所有請求路由都轉交給這個實例對象處理。程式實例是 Flask 類的對象。 Flask 類的構造函數只有一個必須指定的參數,即程式主模塊或包的名字,即我們經常用到的一條語句:app = Flask(__name__)。Python的 __name__ 變數會存儲這些值。

 

另外,Flask 用藍圖 blueprint來在一個應用中或跨應用製作應用組件和支持通用的模式。通過不同的 url_prefix ,從而使用戶的請求到達不同模塊的 view 函數。同時,有效分離了不同模塊,使得開發過程更加的清晰。

 

app和藍圖blueprint還有許多類方法,像route()方法一樣可以作為路由函數的裝飾器,對每一次請求作更精細的判別和操作,在更高效地進行資料庫配置和請求操作,以及處理錯誤請求方面有很大的作用。下篇文章我將會寫一下這方面的內容。

參考閱讀:官方文檔http://flask.pocoo.org/docs/dev/api/#flask.Flask.add_url_rule

例如:

before_first_request   #第一次請求的處理

before_reqeust       #註冊一個函數來實現對每一個路由請求的攔截

after_request        #每一次請求之後額處理

app_context         #上下文環境

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 這一章的課題看起來就很和藹可親了,比起前面繞的我不要不要的工廠模式,那感覺真是太好了,但是正是因為簡單,那麼問題就來了,我怎麼才能把這個東西敘述清楚?怎麼樣才能老少咸宜呢? 如何能夠在把這個東西講清楚的同時,引入一些新的東西讓這個設計模式能顯得不那麼普通呢?我不知道能不能做到,不過,吹x馬上開 ...
  • 代理模式(Proxy Pattern)也叫委托模式,是一個使用率非常高的模式。 定義: 為其他對象提供一種代理以控制對這個對象的訪問。 代理模式是一項基本的設計技巧,許多其他的模式,如狀態模式、策略模式、訪問者模式本質上也採用了代理模式。類圖如下所示。 代理模式提供以下3個角色。 抽象主題(Subj ...
  • 在文章《 "Java 11 正式發佈,這 8 個逆天新特性教你寫出更牛逼的代碼" 》中,我有介紹到 Java 11 的八個新特性,其中關於 String 加強部分,我覺得有點意思,這裡單獨再拉出來講。 Java 11 增加了一系列的字元串處理方法,如以下所示。 最有意思的是 和 方法了,來看下還能怎 ...
  • [TOC] mybatis插件機制 mybatis的插件機制使用動態代理實現,不瞭解的朋友請先瞭解代理模式和動態代理;插件本質是功能增強,那麼它如果需要對某個方法進行增強,首先要攔截這個方法,其實也就類似於攔截器,mybatis的插件在代碼中定義為Interceptor,也就是攔截器;後面統一稱作攔 ...
  • #!/usr/bin/env python # encoding: utf-8 #@author: 東哥加油! #@file: del_tb_bigtable_statistic.py #@time: 2018/11/21 15:39 import pymysql import datetime i... ...
  • 平時在開發過程中dao、bean和XML文件都是自動生成的,很少寫XML的配置關係,今天記錄一下mybatis的關聯查詢中的多對一和一對多的情況。 首先是有兩張表(學生表Student和老師Teacher表),為了更易懂,這裡只設置了最簡單的幾個必要欄位。表結構如下圖: Student表: ​ Te ...
  • 0、介紹 本篇文章是在我看完《從零開始學架構》之後,以架構演變為主線,梳理了一下演變過程中出現的問題以及解決方案,文章中引用了這本書的一些內容和圖片 分散式和集群的概念經常被搞混,現在一句話讓你明白兩者的區別。 分散式:一個業務拆分成多個子業務,部署在不同的伺服器上集群:同一個業務,部署在多個伺服器 ...
  • 機房同傳了新的系統,不使用dev的話每次開機都要重新更改環境變數(其實也可以在編譯命令里添加絕對路徑)。所以就去學習了一下用bat腳本更改pat ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...