Flask中的藍圖旨在針對這些狀況:python
上面是官方的介紹,真深奧,仍是本身解釋一遍吧。linux
藍圖功能,就好像把一個flask項目分紅了N個flask項目。用來分離route路由表。基礎flask教程中,route都寫在main文件中。當項目夠大的時候,幾百個路由,怎麼寫?當項目是多人團隊開發的時候怎麼寫?當新版本上線的時候,老版本怎麼兼容?docker
使用藍圖,就能解決上面的問題。shell
大概就是把@app.route()給分離成多個文件來寫,方便你找到須要修改的地方。方便團隊協做時,我的寫我的的功能模塊,寫在本身的文件裏。新版本和舊版本能夠同時在線,經過不一樣的URL來調用。flask
如今有兩種流行的方式來分割route,來使用藍圖。api
見過使用 api core models服務器
分爲API接口,核心代碼,模型app
我傾向於寫這樣的函數
分割爲 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腳本
初級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地址,進行一下服務器測試。