日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flask框架学习:蓝图的使用

發(fā)布時(shí)間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flask框架学习:蓝图的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考鏈接:Flask 藍(lán)圖的基本使用

在之前的學(xué)習(xí)中,所有的頁面處理邏輯都是放在同一個(gè)文件中的,隨著業(yè)務(wù)的增加,把所有代碼都放在同一個(gè)文件中是不合適的。不僅是閱讀變得困難,而且代碼的維護(hù)也很麻煩。比如:現(xiàn)在我們的頁面有以下幾個(gè)頁面:

現(xiàn)在的情況是,我們把這幾個(gè)頁面的處理代碼都放在了app.py這個(gè)文件里面,隨著頁面的繼續(xù)增加,這個(gè)文件里的代碼就變得越來越多,越來越難以閱讀,這樣顯示是不好的。所以這時(shí)候就用到了藍(lán)圖。

怎么理解藍(lán)圖呢?在這里就是把 /news/society/ 和 /news/tech/ 的相關(guān)功能組成一個(gè)藍(lán)圖 news;程序?qū)?/products/car/ 和 /products/baby/ 的相關(guān)功能組成一個(gè)藍(lán)圖 products。
這里的一個(gè)藍(lán)圖就是news,products是一個(gè)單獨(dú)的py文件。

就相當(dāng)于一個(gè)模塊下面由多個(gè)子模塊,以前所有子模塊放在一個(gè)文件里面,現(xiàn)在是把一個(gè)子模塊變成一個(gè)單獨(dú)的藍(lán)圖。最后再把這些藍(lán)圖整合在一起。

這時(shí)候程序的文件就變成了這樣:2個(gè)藍(lán)圖,共3個(gè)文件

假設(shè)訪問的頁面路徑是 /products/car,Flask 框架在藍(lán)圖 news 和藍(lán)圖 products 中查找匹配該頁面路徑的路由,發(fā)現(xiàn)在藍(lán)圖 products 中,存在和路徑 /products/car 相應(yīng)的處理函數(shù) car_products,最后將請(qǐng)求轉(zhuǎn)發(fā)給函數(shù) car_products 處理。

藍(lán)圖news.py
#這是藍(lán)圖文件 from flask import Blueprint#藍(lán)圖的url前綴,前綴路徑,在藍(lán)圖下面還有路徑 bp = Blueprint('news',__name__,url_prefix='/news')#他們的絕對(duì)路徑是/news/society @bp.route('/society') def society_news():return '社會(huì)新聞板塊'@bp.route('/tech') def tech_news():return 'IT 新聞板塊'

首先是導(dǎo)入藍(lán)圖Blueprint

然后創(chuàng)建藍(lán)圖對(duì)象:
第1個(gè)參數(shù)’news’是藍(lán)圖的名稱,暫時(shí)還不知道用處是什么。

第2個(gè)參數(shù) __name__ 是該藍(lán)圖所在的模塊名,該藍(lán)圖的實(shí)現(xiàn)文件是 news.py,因此 __name__ 是 ‘news’;

注意:藍(lán)圖文件是需要被導(dǎo)入的,如果是在news.py文件直接右鍵執(zhí)行的時(shí)候,__name__ == '__main__',但是在被導(dǎo)入的時(shí)候,代碼執(zhí)行,__name__=='news',也就是模塊名。

第 3 個(gè)參數(shù)是指定頁面的 URL 前綴為 ‘/news’,它會(huì)影響路由中路徑的設(shè)置。就是說,在news.py文件中的其他路由,它的絕對(duì)路徑是/news/society,/news/tech,相當(dāng)于是在/news這個(gè)路由下面的子路由。

創(chuàng)建一個(gè)藍(lán)圖對(duì)象,bp,然后使用bp.route('/society')設(shè)置這個(gè)藍(lán)圖內(nèi)的路由,注意:是藍(lán)圖內(nèi)的路由,在這個(gè)藍(lán)圖下的路由,而藍(lán)圖之外,訪問需要使用前綴,就是/news/society.

藍(lán)圖 products.py
#這是藍(lán)圖文件 from flask import Blueprintbp = Blueprint('products',__name__,url_prefix='/products')@bp.route('/car') def car_products():return '汽車產(chǎn)品板塊'@bp.route('/baby') def baby_products():return '嬰兒產(chǎn)品板塊'

現(xiàn)在頁面的邏輯被分開了,news和products是分開的,所以需要一個(gè)文件來組裝他倆,那就是app.py文件

app.py
from flask import Flask #導(dǎo)入藍(lán)圖文件 import news import productsapp = Flask(__name__) #注冊(cè)藍(lán)圖,注冊(cè)的是那個(gè)bp對(duì)象 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()

首先要導(dǎo)入剛才創(chuàng)建的兩個(gè)py文件,就是藍(lán)圖文件。
接著使用注冊(cè)藍(lán)圖的方法app.register_blueprint(news.bp),參數(shù)就是藍(lán)圖文件中創(chuàng)建的藍(lán)圖對(duì)象bp,這樣就把兩個(gè)藍(lán)圖文件組裝起來了。

訪問

更具拓展性的架構(gòu)

在剛才的架構(gòu)中,程序是這樣的:

  • 程序由主程序和多個(gè)藍(lán)圖構(gòu)成;
  • 每個(gè)藍(lán)圖對(duì)應(yīng)一個(gè) Python 文件;
  • 所有的藍(lán)圖共享相同的模板文件目錄;
  • 所有的藍(lán)圖共享相同的靜態(tài)文件目錄。

當(dāng)然這里沒有用到模板文件和靜態(tài)文件,如果用到的話,他們應(yīng)該都放在templates和static文件夾下面。

還有一種方式的拓展性會(huì)更好:

使用一個(gè)獨(dú)立的目錄實(shí)現(xiàn)藍(lán)圖

在這種架構(gòu)中,程序的擴(kuò)展性最好:

  • 程序由主程序和多個(gè)藍(lán)圖構(gòu)成;
  • 每個(gè)藍(lán)圖對(duì)應(yīng)一個(gè)獨(dú)立的目錄,存儲(chǔ)與這個(gè)藍(lán)圖相關(guān)的文件;
  • 每個(gè)藍(lán)圖有一個(gè)獨(dú)立的模板文件目錄;
  • 每個(gè)藍(lán)圖有一個(gè)獨(dú)立的靜態(tài)文件目錄。

這時(shí)候的文件結(jié)構(gòu)是這樣的:

每一個(gè)藍(lán)圖文件有自己的static和templates文件夾,靜態(tài)文件static與模板文件templates的尋找規(guī)則如下:

  • 如果項(xiàng)目中的 static/templates文件夾中存在相應(yīng)的靜態(tài)文件/模板文件,則使用 static/templates 文件夾下的靜態(tài)文件/模板文件;

  • 如果項(xiàng)目中的 static/templates 文件夾中沒有相應(yīng)的靜態(tài)文件/模板文件,則使用定義藍(lán)圖的時(shí)候指定的 static/templates 文件夾下的靜態(tài)文件/模板文件。

這里會(huì)嘗試的用到藍(lán)圖自己的模板文件與靜態(tài)文件。

首先我們需要?jiǎng)?chuàng)建news和products兩個(gè)包文件:python package.
創(chuàng)建完成后,會(huì)自動(dòng)生成__init__.py文件,這個(gè)文件里將實(shí)現(xiàn)具體的代碼,然后在分別給在兩個(gè)包下面創(chuàng)建自己的static和templates文件夾。

文件結(jié)構(gòu)如下:

實(shí)現(xiàn) /news/_init_.py
from flask import Blueprint,render_template#每一個(gè)藍(lán)圖有自己的static和templates文件夾,需要設(shè)置路徑 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')

這里需要設(shè)置以下templates和static文件的路徑,template_folder='templates',static_folder='static'

這時(shí)候模板和靜態(tài)文件會(huì)在這個(gè)路徑下尋找。

對(duì)應(yīng)的模板文件

實(shí)現(xiàn)/news/templates/society_news.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>社會(huì)新聞板塊</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">社會(huì)新聞板塊</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

實(shí)現(xiàn)/news/static/css/society_news.css
li {font-size: 20px; } #society {color: red; }
實(shí)現(xiàn)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()

在我們導(dǎo)入import news的時(shí)候,這個(gè)包下面的__init__.py文件就會(huì)自動(dòng)執(zhí)行。

執(zhí)行訪問:

這個(gè)例子的結(jié)構(gòu)就會(huì)更加的具有邏輯性。

總結(jié)

以上是生活随笔為你收集整理的Flask框架学习:蓝图的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。