Python進階(四十九)-初識Flask Blueprint
前言
在進行Python Web開發時選擇Flask框架。項目模塊劃分階段,使用Blueprint(這里暫且稱之為“藍本”)。Blueprint通過把實現不同功能的module分開,從而把一個大的application分割成各自實現不同功能的module。在一個Blueprint中可以調用另一個blueprint的view function, 但要加相應的blueprint名。
Blueprint還有其他好處,其本質上來說就是讓程序更加松耦合,更加靈活,增加復用性,提高查錯效率,降低出錯概率。
在具體項目開發過程中,不同藍本分別對應不同的功能模塊。例如auth授權模塊和項目主模塊。
##實例講解
下面以實際項目開發為例,項目結構圖如下圖所示:
不同藍本分別位于不同的Python包中,而藍圖的創建則位于Python包下的__init__.py文件。不同Python包下的views.py文件則對應不同藍本下的路由。
在示例項目中,auth授權包下的藍本創建代碼如下:
from flask import Blueprint auth = Blueprint('auth', __name__) from . import forms, views
1
2
3
4
5
上面的藍本創建語句創建了名為“auth”的藍本。之所以將from . import forms, views導包語句置于__init__.py末尾,是為了避免循環導入依賴,因為在views.py中還要導入藍本auth。
Views.py文件內容如下:
from flask import request, flash, render_template, redirect, url_for from . import auth from web_flask.app.dal_pymysql import DataManager # 管理員登錄 @auth.route('/login', methods=['POST']) def login(): form = request.form # 由于request中的form參數以字典的形式存在,故以下語句等價 uname = request.form['username'] pwd = request.form['password']
1
2
3
4
5
6
7
8
9
10
11
在這里使用from . import auth方式導入所需藍本。藍本的注冊語句則置于項目創建的工廠方法中,注冊代碼如下:
from .auth import auth as auth_blueprint from .main import main as main_blueprint # 注冊藍本 url_prefix='/admin' app.register_blueprint(auth_blueprint,) app.register_blueprint(main_blueprint, static_folder='static') return app
1
2
3
4
5
6
在藍本注冊函數register_blueprint()中,第一個參數為所注冊的藍本名稱。當我們在應用對象上注冊一個藍圖時,需要指定一個url_prefix關鍵字 參數(這個參數默認是/)。其余可增參數詳見Flask官方文檔。
注意事項
注意:在藍本中編寫視圖函數views.py主要有兩點不同:
第一,和前面的路由程序一樣,路由修飾器由藍本提供;
第二,url_for() 函數的用法不同。
你可能還記得,url_for() 函數的第一個參數是路由的端點名,在程序的路由中,默認為視圖函數的名字。例如,在單腳本程序中,index() 視圖函數的URL 可使用url_for(‘index’) 獲取。
在藍本中就不一樣了,Flask 會為藍本中的全部端點加上一個命名空間,這樣就可以在不同的藍本中使用相同的端點名定義視圖函數,而不會產生沖突。命名空間就是藍本的名字(Blueprint 構造函數的第一個參數),所以視圖函數index() 注冊的端點名是main.index,其URL 使用url_for(‘main.index’) 獲取。
url_for()函數還支持一種簡寫的端點形式,在藍本中可以省略藍本名,例如url_for(’.index’)。在這種寫法中,命名空間是當前請求所在的藍本。這意味著同一藍本中的重定向可以使用簡寫形式,但跨藍本的重定向必須使用帶有命名空間的端點名。
如果不使用url_for(‘main.index’) 或url_for(’.index’) 的形式,在項目運行過程中就會提示請求的URL錯誤。
附 電子書福利(免積分下載)
《Flask Web開發:基于Python的Web應用開發實戰》
《Learning Python, 5th Edition》
Flask Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。