Flask框架学习:蓝图的使用
參考鏈接:Flask 藍圖的基本使用
在之前的學習中,所有的頁面處理邏輯都是放在同一個文件中的,隨著業務的增加,把所有代碼都放在同一個文件中是不合適的。不僅是閱讀變得困難,而且代碼的維護也很麻煩。比如:現在我們的頁面有以下幾個頁面:
現在的情況是,我們把這幾個頁面的處理代碼都放在了app.py這個文件里面,隨著頁面的繼續增加,這個文件里的代碼就變得越來越多,越來越難以閱讀,這樣顯示是不好的。所以這時候就用到了藍圖。
怎么理解藍圖呢?在這里就是把 /news/society/ 和 /news/tech/ 的相關功能組成一個藍圖 news;程序將 /products/car/ 和 /products/baby/ 的相關功能組成一個藍圖 products。
這里的一個藍圖就是news,products是一個單獨的py文件。
就相當于一個模塊下面由多個子模塊,以前所有子模塊放在一個文件里面,現在是把一個子模塊變成一個單獨的藍圖。最后再把這些藍圖整合在一起。
這時候程序的文件就變成了這樣:2個藍圖,共3個文件
假設訪問的頁面路徑是 /products/car,Flask 框架在藍圖 news 和藍圖 products 中查找匹配該頁面路徑的路由,發現在藍圖 products 中,存在和路徑 /products/car 相應的處理函數 car_products,最后將請求轉發給函數 car_products 處理。
藍圖news.py
#這是藍圖文件 from flask import Blueprint#藍圖的url前綴,前綴路徑,在藍圖下面還有路徑 bp = Blueprint('news',__name__,url_prefix='/news')#他們的絕對路徑是/news/society @bp.route('/society') def society_news():return '社會新聞板塊'@bp.route('/tech') def tech_news():return 'IT 新聞板塊'首先是導入藍圖Blueprint
然后創建藍圖對象:
第1個參數’news’是藍圖的名稱,暫時還不知道用處是什么。
第2個參數 __name__ 是該藍圖所在的模塊名,該藍圖的實現文件是 news.py,因此 __name__ 是 ‘news’;
注意:藍圖文件是需要被導入的,如果是在news.py文件直接右鍵執行的時候,__name__ == '__main__',但是在被導入的時候,代碼執行,__name__=='news',也就是模塊名。
第 3 個參數是指定頁面的 URL 前綴為 ‘/news’,它會影響路由中路徑的設置。就是說,在news.py文件中的其他路由,它的絕對路徑是/news/society,/news/tech,相當于是在/news這個路由下面的子路由。
創建一個藍圖對象,bp,然后使用bp.route('/society')設置這個藍圖內的路由,注意:是藍圖內的路由,在這個藍圖下的路由,而藍圖之外,訪問需要使用前綴,就是/news/society.
藍圖 products.py
#這是藍圖文件 from flask import Blueprintbp = Blueprint('products',__name__,url_prefix='/products')@bp.route('/car') def car_products():return '汽車產品板塊'@bp.route('/baby') def baby_products():return '嬰兒產品板塊'現在頁面的邏輯被分開了,news和products是分開的,所以需要一個文件來組裝他倆,那就是app.py文件
app.py
from flask import Flask #導入藍圖文件 import news import productsapp = Flask(__name__) #注冊藍圖,注冊的是那個bp對象 app.register_blueprint(news.bp) app.register_blueprint(products.bp)@app.route('/') def hello_world(): # put application's code herereturn 'Hello World!'if __name__ == '__main__':app.run()首先要導入剛才創建的兩個py文件,就是藍圖文件。
接著使用注冊藍圖的方法app.register_blueprint(news.bp),參數就是藍圖文件中創建的藍圖對象bp,這樣就把兩個藍圖文件組裝起來了。
訪問
更具拓展性的架構
在剛才的架構中,程序是這樣的:
- 程序由主程序和多個藍圖構成;
- 每個藍圖對應一個 Python 文件;
- 所有的藍圖共享相同的模板文件目錄;
- 所有的藍圖共享相同的靜態文件目錄。
當然這里沒有用到模板文件和靜態文件,如果用到的話,他們應該都放在templates和static文件夾下面。
還有一種方式的拓展性會更好:
使用一個獨立的目錄實現藍圖
在這種架構中,程序的擴展性最好:
- 程序由主程序和多個藍圖構成;
- 每個藍圖對應一個獨立的目錄,存儲與這個藍圖相關的文件;
- 每個藍圖有一個獨立的模板文件目錄;
- 每個藍圖有一個獨立的靜態文件目錄。
這時候的文件結構是這樣的:
每一個藍圖文件有自己的static和templates文件夾,靜態文件static與模板文件templates的尋找規則如下:
-
如果項目中的 static/templates文件夾中存在相應的靜態文件/模板文件,則使用 static/templates 文件夾下的靜態文件/模板文件;
-
如果項目中的 static/templates 文件夾中沒有相應的靜態文件/模板文件,則使用定義藍圖的時候指定的 static/templates 文件夾下的靜態文件/模板文件。
這里會嘗試的用到藍圖自己的模板文件與靜態文件。
首先我們需要創建news和products兩個包文件:python package.
創建完成后,會自動生成__init__.py文件,這個文件里將實現具體的代碼,然后在分別給在兩個包下面創建自己的static和templates文件夾。
文件結構如下:
實現 /news/_init_.py
from flask import Blueprint,render_template#每一個藍圖有自己的static和templates文件夾,需要設置路徑 bp = Blueprint('news',__name__,url_prefix='/news',template_folder='templates',static_folder='static')@bp.route('/society') def society_news():return render_template('society_news.html')@bp.route('/tech') def tech_news():return render_template('tech_news.html')這里需要設置以下templates和static文件的路徑,template_folder='templates',static_folder='static'
這時候模板和靜態文件會在這個路徑下尋找。
對應的模板文件
實現/news/templates/society_news.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>社會新聞板塊</title><link rel="stylesheet" type="text/css" href="{{ url_for('news.static',filename='css/society_news.css') }}" /> </head> <body><p>新聞板塊</p> <ul><li id="society">社會新聞板塊</li><li>科技新聞板塊</li><li>{{ url_for('news.static',filename='css/society_news.css') }}</li> </ul> </body> </html>加載css文件:
<link rel="stylesheet" type="text/css" href="{{ url_for('news.static',filename='css/society_news.css') }}" />這里是news.static,不是news/static。
url_for('news.static',filename='css/society_news.css')返回的是路徑 /news/static/css/society_news.css
實現/news/static/css/society_news.css
li {font-size: 20px; } #society {color: red; }實現app.py
from flask import Flask # from news import bp as news_bp import news import productsapp = Flask(__name__) app.register_blueprint(news.bp) #app.register_blueprint(products.bp)@app.route('/') def hello_world(): # put application's code herereturn 'Hello World!'if __name__ == '__main__':app.run()在我們導入import news的時候,這個包下面的__init__.py文件就會自動執行。
執行訪問:
這個例子的結構就會更加的具有邏輯性。
總結
以上是生活随笔為你收集整理的Flask框架学习:蓝图的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学建模————统计问题之评价(三)
- 下一篇: [附源码]计算机毕业设计springbo