flask使用Blueprint進行多模塊應用的編寫
1、blueprint
2、分模塊後的結構
3、業務模塊
4、運行
5、總結
1、blueprint
在使用flask進行一個項目編寫的時候,可能會有許多個模塊,如一個普通的互聯網sass雲辦公應用,會有用戶管理、部門管理、賬號管理等模塊,如果把所有的這些模塊都放在一個views.py文件之中,那麼最後views.py文件必然臃腫不堪,並且極難維護,因此flask中便有了blueprint的概念,可以分別定義模塊的視圖、模板、視圖等等,我們可以使用blueprint進行不同模塊的編寫,不同模塊之間有着不同的靜態文件、模板文件、view文件,十分方便代碼的維護和管理,下面就是使用blueprint來進行上面用戶管理、部門管理、賬號管理模塊的模擬編寫,只涉及到api層面上,模板文件和靜態文件就不寫在上面了。
2、分模塊後的結構
在進行分模塊編寫接口之後,以前提供的接口就不能寫在一個views.py文件之中,具體結構如下所示:
dept: 這是部門管理模塊,views是相應的接口文件。
user: 這是用戶管理模塊,同上,views是用戶管理的相應接口。
其他的和之前的類似。
3、業務模塊
3.1 dept模塊
__init__.py:
# coding:utf-8
from flask import Blueprint
dept = Blueprint('dept', __name__,)
from app.dept import views
在這裏,我們定義了dept blueprint對象,便於在views.py文件中應用,替代Flask對象。
主要的接口
views.py:
# coding:utf-8
from app.dept import dept
from flask import jsonify
import json
dept_data = [
{
'name': '部門1',
'id': 12345
},
{
'name': '部門2',
'id': 12346
}
]
@dept.route('/<int:id>', methods=['GET', ])
def get(id):
for dept in dept_data:
if int(dept['id']) == id:
return jsonify(status='success', dept=dept)
return jsonify(status='failed', msg='dept not found')
@dept.route('/depts', methods=['GET', ])
def get_depts():
data = {
'status': 'success',
'depts': dept_data
}
return json.dumps(data, ensure_ascii=False, indent=1)
提供兩個接口,一個接口用於查詢特定的部門,一個接口用於返回部門列表,dept對象我是模擬的部門數組,沒有用models.py文件中dept對象,主要是在這一節中沒有使用相應的orm框架,因此就沒寫相應的model,這個在隨後中會涉及到。
另外一個,我在獲取depts接口時,用的就不是jsonify方法了,而是內置的json.dumps轉換爲json對象,我之所以這樣寫,是因爲jsonify如果要返回數組對象的話,必須要相應的對象實現一個方法返回json數據,或者將這個對象轉成字典類型,然後循環遍歷這個對象,比較麻煩,因此這裏我就直接使用json.dumps來進行轉換了。
在相應的路由註解上,我使用的就是dept.route,因此在定義了爲dept的blueprint對象後,這裏的作用相當於當初定義的app Flask對象,但其實是進行了view層的路由後,最終還是註冊到了app上面,在代碼層面上實現了不同模塊之間的隔離。
3.2、user模塊
user模塊功能和代碼大部分和dept相同,這裏僅僅只貼出代碼,不再描述具體的功能。
__init__.py:
# coding:utf-8
from flask import Blueprint
user = Blueprint('user', __name__,)
from app.user import views
views.py:
# coding: utf-8
from app.user import user
from flask import jsonify
import json
user_data = [
{
'id': 1,
'name': '張三',
'age': 23
},
{
'id': 2,
'name': '李四',
'age': 24
}
]
@user.route('/<int:id>', methods=['GET', ])
def get(id):
for user in user_data:
if user['id'] == id:
return jsonify(status='success', user=user)
@user.route('/users', methods=['GET', ])
def users():
data = {
'status': 'success',
'users': user_data
}
return json.dumps(data, ensure_ascii=False, indent=1)
3.3、run.py文件
最終Blueprint對象在run文件之中進行註冊,如下:
# coding:utf-8
from app import app
from app.dept import dept
from app.user import user
app.register_blueprint(user, url_prefix='/user')
app.register_blueprint(dept, url_prefix='/dept')
if __name__ == '__main__':
app.run()
app.register_blueprint在這裏進行了Blueprint對象的註冊和路由,在這裏還有許多用法,如制定靜態文件夾和模板文件夾等等,這些可以參考以下自己學習:
其他的我就沒有再講了,config.py和manager.py在這些簡單的應用中還無需用到,講到後面再來說這些的作用。
4、運行
啓動run文件,進行運行,請求
http://localhost:5000/user/
結果:
第一個接口請求成功:
請求第二個接口:
http://localhost:5000/user/users
接口同樣請求成功,在這裏dept模塊就不去請求,結果是類似的。
5、總結
Blueprint其實本身只是對view上的接口進行了註冊,然後整體掛載在app上,Blueprint本身的目的就是組織多模塊的平行共存,避免直接在app上註冊view,其實更多的只是方便開發和代碼的維護,因爲最終所有的views上的接口都仍然是直接掛載在app上,其實對應整個應用來說,沒有什麼明顯的區別。
Flask 中的Blueprint不是一個可插撥的應用,因爲它不是一個真正的應用,而是一套可以註冊 在應用中的操作,並且可以註冊多次。
同時在這裏,我們不能使用多個flask對象來管理和註冊,因爲這樣會導致每個flask對象都有一個自己的配置,不好管理。
使用Blueprint,應用會在Flask層中進行管理,共享配置,通過註冊按需改變應用 對象。Blueprint的缺點是一旦應用被創建後,只有銷燬整個應用對象才能註銷lueprint。
綜合以上,簡單來說,Blueprint就是通過url找到view的一套機制,並沒有太過於複雜的邏輯。