Flask框架從入門到精通之藍圖(二十四)

〆 小源。發表於2019-05-04

知識點: 1、藍圖

一、概況

從前面的知識點能看出來,我們所有的檢視函式都寫在了一個檔案當中,當我們的業務越來複雜的時候。檢視函式也會變得越來越多,導致閱讀不方便,維護起來困難等難題。比如下面這樣:

from flask import Flask
from flask_script import Manager

app = Flask(__name__)


@app.route('/')
def index():
    return 'index page'

# home檢視
@app.route('/home')
def home():
    return 'home page'

# center檢視
@app.route('/center')
def center():
    return 'center page'

# order檢視
@app.route('/order')
def order():
    return 'order page'

# cart檢視
@app.route('/cart')
def cart():
    return 'cart page'


if __name__ == '__main__':
    # 0.0.0.0代表任何能代表這臺機器的地址都可以訪問
    app.run(host='0.0.0.0', port=5000, debug=True)  # 執行程式

複製程式碼

能看出來,當我們業務有新的需求的時候,我們還會往這個裡面新增檢視函式。

二、使用裝飾器解決

例如我們把上面的home檢視抽出來,放到單獨的一個home.py檔案中。在此檔案只寫一個沒有被裝飾器裝飾的檢視函式。

def home():
    return 'home page'
複製程式碼

然後在Flask的啟動程式檔案中,把home檢視在重新用裝飾器裝飾起來。

from flask import Flask
from home import home

app = Flask(__name__)

# 裝飾home檢視
app.route('/home')(home)


@app.route('/')
def index():
    return 'index page'


if __name__ == '__main__':
    # 0.0.0.0代表任何能代表這臺機器的地址都可以訪問
    app.run(host='0.0.0.0', port=5000, debug=True)  # 執行程式

複製程式碼

我們在瀏覽器除錯一下:

在這裡插入圖片描述
可以發現,這樣完全是可以的。其他的功能檢視也可以這麼做。但是這麼做有個缺點,就是我們去單獨home.py看的時候,根本不知道這個檢視函式對應的路徑是什麼?如果想知道,我們必須要去Flask啟動檔案中去檢視。

三、藍圖

  • 什麼是藍圖 Flask中的藍圖有點像Django框架的app的意思。就是把一個專案模組化,每個模組所用的檢視、靜態檔案、模板放在一個盒子裡。

  • 使用藍圖 在使用藍圖之前,我們需要先建立藍圖,繼續那我們上面的home檢視函式舉例,把home.py檔案裡面的程式碼修改如下:

from flask import Blueprint

# app_home值藍圖的名稱,
# __name__指藍圖所在模組
app_home = Blueprint('app_home', __name__)


# 註冊藍圖路由
@app_home.route('/home')
def home():
    return 'home page'

複製程式碼

Flask的啟動程式檔案中,匯入藍圖並註冊藍圖:

from flask import Flask
#匯入藍圖
from home import app_home

app = Flask(__name__)


# 註冊藍圖
app.register_blueprint(app_home)


@app.route('/')
def index():
    return 'index page'


if __name__ == '__main__':
    # 0.0.0.0代表任何能代表這臺機器的地址都可以訪問
    app.run(host='0.0.0.0', port=5000, debug=True)  # 執行程式

複製程式碼

我們在瀏覽器除錯一下:

在這裡插入圖片描述
我們訪問一些網站地址的時候會發現url知道,比如訪問使用者中心地址是/user/center/;比如訪問使用者資訊地址是/user/info/。這些地址有一個相同的字首。在Flask中用url_prefix可以給藍圖模組新增一個共同的地址。

app.register_blueprint(app_home, url_prefix='/user')
複製程式碼

我們在瀏覽器除錯一下:

在這裡插入圖片描述

四、以藍圖模組匯入

我們還可以把Flask中的藍圖用python中包的概念管理起來。還是上面的例子,我們建立一個home資料夾(包):

在這裡插入圖片描述
那這個資料夾裡面可以就放home模組所用到的檢視函式、模板、靜態檔案等。 在__init__.py檔案中建立藍圖:

from flask import Blueprint

# app_home值藍圖的名稱,
# __name__指藍圖所在模組
app_home = Blueprint('app_home', __name__)

from .views import home

複製程式碼

在views.py檔案中註冊藍圖路由:

from . import app_home


# 註冊藍圖路由
@app_home.route('/home')
def home():
    return 'home page'

複製程式碼

在Flask啟動檔案匯入藍圖:

from flask import Flask
# 匯入藍圖
from home import app_home

app = Flask(__name__)

# 註冊藍圖
app.register_blueprint(app_home, url_prefix='/user')


@app.route('/')
def index():
    return 'index page'


if __name__ == '__main__':
    # 0.0.0.0代表任何能代表這臺機器的地址都可以訪問
    app.run(host='0.0.0.0', port=5000, debug=True)  # 執行程式

複製程式碼

我們在瀏覽器除錯一下:

在這裡插入圖片描述
如果想使用藍圖中自己的模板,比如我們在藍圖中建立一個模板:
在這裡插入圖片描述
必須要在建立藍圖的時候,指定模板路徑,否則會找不到模板。靜態檔案是一樣的。
在這裡插入圖片描述
我們修改一下home的檢視函式,改成載入模板:

from . import app_home
from flask import render_template


# 註冊藍圖路由
@app_home.route('/home')
def home():
    return render_template('home.html')

複製程式碼

我們在瀏覽器除錯一下:

在這裡插入圖片描述
溫馨提示:根及的templates大於藍圖中templates。也就是說我們把home.html移動到根及的templates,檢視函式是照樣可以找到模板的。因為是先去根及找,再去藍圖中找。
在這裡插入圖片描述

歡迎關注我的公眾號:

image

相關文章