簡介:
Flask中的藍圖旨在針對這些情況:
- 把一個應用分解成一系列的藍圖。對於大型的應用是理想化的;一個項目能實例化一個應用, 初始化一些擴展,以及注冊一系列的藍圖。
- 以一個 URL 前綴和/或子域在一個應用上注冊藍圖。 URL 前綴/子域名中的參數即成為這個藍圖下的所有視圖函數的共同的視圖參數(默認情況下)。
- 在一個應用中用不同的 URL 規則多次注冊一個藍圖。
- 通過藍圖提供模板過濾器、靜態文件、模板和其它功能。一個藍圖不一定要實現應用或視圖函數。
- 初始化一個 Flask 擴展時,在這些情況中注冊藍圖。
上面是官方的介紹,真深奧,還是自己解釋一遍吧。
藍圖功能,就好像把一個flask項目分成了N個flask項目。用來分離route路由表。基礎flask教程中,route都寫在main文件中。當項目夠大的時候,幾百個路由,怎么寫?當項目是多人團隊開發的時候怎么寫?當新版本上線的時候,老版本怎么兼容?
使用藍圖,就能解決上面的問題。
大概就是把@app.route()給分離成多個文件來寫,方便你找到需要修改的地方。方便團隊協作時,個人寫個人的功能模塊,寫在自己的文件里。新版本和舊版本可以同時在線,通過不同的URL來調用。
一:構建藍圖
現在有兩種流行的方式來分割route,來使用藍圖。
1.根據類型來分割
見過使用 api core models
分為API接口,核心代碼,模型
2.根據應用來分割
我傾向於寫這樣的
分割為 app01 app02 app03……
見過的一般分為 auth admin main news
二:建立藍圖目錄結構
從上篇的空白flask項目中繼續建立目錄和文件。
演示設計,把所有的藍圖分割,都按應用放在app目錄下,分割為main,app01,app02.
. ├── app #python項目目錄-同步上傳目錄 │ ├── app #所有的app目錄 │ │ ├── app01 #第一個應用 │ │ │ └── views.py #第一個應用的視圖 │ │ ├── app02 #第二個應用 │ │ │ └── views.py #第二個應用的視圖 │ │ └── main #主應用?默認應用?隨便叫什么吧,就是首頁,區別一下名字 │ │ └── views.py #該應用的視圖 │ ├── build_requirements.py #生成requirements的程序 │ ├── main.py #主入口 │ └── requirements.txt #依賴包列表 ├── dockerfile #生成docker鏡像的dockerfile └── rebuild.sh #自動停止容器,刪除容器,重建鏡像,啟動鏡像的linux shell腳本
三:建立藍圖views
初級flask教程中,只進行了app.route的路由注冊。
這里開始使用藍點注冊路由。
main.views
from flask import Blueprint main=Blueprint('main',__name__) @main.route('/') def show(): return 'main.hello'
app01.views
from flask import Blueprint app01=Blueprint('app01',__name__) @app01.route('/') def show(): return 'app01.hello'
app02.views
from flask import Blueprint app02=Blueprint('app02',__name__) @app02.route('/') def show(): return 'app02.hello'
大家會發現,我把路由都注冊到了/下面。
不過它們是在不同的藍點下面,也不沖突。
四:注冊藍圖
修改main.py
把剛才注冊的藍點路由,注冊到程序的主入口文件中
from flask import Flask
from app.main.views import *
from app.app01.views import *
from app.app02.views import *
app = Flask(__name__)
app.register_blueprint(main)
app.register_blueprint(main,url_prefix='/index')
app.register_blueprint(app01,url_prefix='/app01')
app.register_blueprint(app02,url_prefix='/app02')
app.register_blueprint(app01,url_prefix='/app03')
app.register_blueprint(app02,url_prefix='/app04')
app.register_blueprint(app02)
if __name__=='__main__':
app.run()
大家會注意到,我注冊了兩次main,區別是url_prefix。可以理解為掛載點不同。
結合測試,和大家繼續講這些東西是怎么用的。
五:本機測試
本機測試:
運行以后,應該會提示你訪問:http://127.0.0.1:5000
瀏覽地址 | 顯示結果 | 路由位置 |
http://127.0.0.1:5000 | main.hello | main.views--@main.route('/') |
http://127.0.0.1:5000/index | main.hello | main.views--@main.route('/') |
http://127.0.0.1:5000/app01 | app01.hello | app01.views--@app01.route('/') |
http://127.0.0.1:5000/app02 | app02.hello | app02.views--@app02.route('/') |
http://127.0.0.1:5000/app03 | app01.hello | app01.views--@app01.route('/') |
http://127.0.0.1:5000/app04 | app02.hello | app02.views--@app02.route('/') |
我注冊了兩次main,一次注冊是沒有給掛載點的,一次是有掛載點的。那么這一個路由,可以由默認位置訪問,也可以由掛載點訪問。
不同的藍點,使用不同的掛載點掛載后,藍點內的掛載點不沖突。
app.register_blueprint(main)
app.register_blueprint(app02,url_prefix='/app02')
app.register_blueprint(app02)
這三行看着貌似沖突了。main和app02都進行了默認掛載,無掛載點掛載,且掛載內部,都是掛載在‘/’下,其實並不沖突,flask並不校驗這些,只是在路由里面尋找匹配的第一個路由,並返回給客戶端,所以訪問http://127.0.0.1:5000,返回main.hello。
而app02掛載兩次匹配路由的時候,只有http://127.0.0.1:5000/app02,才是第一個匹配的路由,才可以返回app02.hello。
app.register_blueprint(app01,url_prefix='/app01')
app.register_blueprint(app01,url_prefix='/app03')
這兩行看着也是沖突的重復掛載,這就是多次注冊一個藍圖,訪問http://127.0.0.1:5000/app01 http://127.0.0.1:5000/app03 都是訪問同一個藍圖,即app01.views--@app01.route('/')
可以多做點測試,更深入的理解一下藍點的路由。
六:同步到服務器
syncthing教程
同步開發機的project目錄到服務器的 /app
七:重建並啟動鏡像
上篇寫好的腳本,開放端口為8800
八:測試訪問
按照本機測試,替換一下IP地址,進行一下服務器測試。