flask路由規划藍圖和route


引言:

  • 在寫任何web項目的時候路由的配置永遠都是不可或缺的,如django中的include方法flask中的Blueprint這些都是用於將多個application中的路由區別開來,如果你要使用restful風格,那么這種路由一定是必須做的,很多教程在編寫代碼會在每一個視圖函數上面寫清楚完整的路徑,包括請求的參數、以及請求的方法,其實就是為了達到這樣的目的

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

     

     

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

blueprint的實現
在相應的視圖文件中編寫
from flask import Blueprint

route_index = Blueprint('index_page',__name__)
@route_index.route('/')
def index():
    return 'hello wrold'
在主模塊views.py文件中注冊藍圖
from web.controllers.index import route_index #導入已經寫好的藍圖
from application import app #導入app


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

#第一個參數:表示注冊的藍圖名
#第二個參數:表示訪問的路徑

#這樣在使用該路由裝飾器的時候可以避免寫多余的重復的路徑
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為必填參數,其余是可選參數,不填為None值
url_prefix:路由前綴
例如:想到達http://goods/article/first
在這個路由中goods是通用路由,是article板塊的前綴
如果使用該路由設置的裝飾器那么可以省略的只寫article/first的內容



template_folder:模板文件夾
如果想從其他模塊的模板文件夾中調度模板來使用,需要使用template_folder來指明模板的搜尋路徑
同樣的,static_folder與static_url_path的功能與template_folder類似


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



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的這個參數能夠有效定義路由的具體功能,使一個路由更具體化,避免程序編寫過程中隨意的改動造成錯誤。
說人話就是url_defaults設置以后參數名只能是傳入字典的鍵,以上面的例子來說如果沒有設置url_defaults那么參數鍵值為任意整數均可,其他情況以此類推。
也就是說,一旦設定了這個參數值,那么這個路由的別名就定死了。
 
'''

  

關於route方法

 1 @app.route('/','index',index)  
 2 
 3 def index():
 4 
 5    pass
 6 
 7 #帶引號的是endpoint,不帶引號的index是路由函數名,必須要與下面定義的函數名相同
 8 
 9 '''
10 
11 關於endpoint
12 endpoint相當於實際url的一個別名,在瀏覽器輸入地址時,需要在flask后台尋找相應的路由函數(從而查找相應的資源),而在查找的過程中,不是直接用物理地址來進行硬編碼的,而是通過映射成endpoint來查找。也就是說,開發者定義的每一個路由地址都有一個注冊的endpoint與之對應。在客戶端輸入地址在后台查詢資源的時候,通過這個endpoint來查找相應的路由函數。
13 '''

深入理解Flask請求機制:

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

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

 

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

例如:

before_first_request #第一次請求的處理

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

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

app_context #上下文環境

 

參考鏈接:

https://blog.csdn.net/qq_35020943/article/details/86919753


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM