flask項目結構(三)使用藍圖

簡介:

Flask中的藍圖旨在針對這些狀況:python

  • 把一個應用分解成一系列的藍圖。對於大型的應用是理想化的;一個項目能實例化一個應用, 初始化一些擴展,以及註冊一系列的藍圖。
  • 以一個 URL 前綴和/或子域在一個應用上註冊藍圖。 URL 前綴/子域名中的參數即成爲這個藍圖下的全部視圖函數的共同的視圖參數(默認狀況下)。
  • 在一個應用中用不一樣的 URL 規則屢次註冊一個藍圖。
  • 經過藍圖提供模板過濾器、靜態文件、模板和其它功能。一個藍圖不必定要實現應用或視圖函數。
  • 初始化一個 Flask 擴展時,在這些狀況中註冊藍圖。

上面是官方的介紹,真深奧,仍是本身解釋一遍吧。linux

藍圖功能,就好像把一個flask項目分紅了N個flask項目。用來分離route路由表。基礎flask教程中,route都寫在main文件中。當項目夠大的時候,幾百個路由,怎麼寫?當項目是多人團隊開發的時候怎麼寫?當新版本上線的時候,老版本怎麼兼容?docker

使用藍圖,就能解決上面的問題。shell

大概就是把@app.route()給分離成多個文件來寫,方便你找到須要修改的地方。方便團隊協做時,我的寫我的的功能模塊,寫在本身的文件裏。新版本和舊版本能夠同時在線,經過不一樣的URL來調用。flask

 

一:構建藍圖

如今有兩種流行的方式來分割route,來使用藍圖。api

1.根據類型來分割

見過使用  api core models服務器

分爲API接口,核心代碼,模型app

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地址,進行一下服務器測試。

相關文章
相關標籤/搜索