flask blueprint

轉載:https://cloud.tencent.com/developer/article/1033429

一、blueprint

在使用flask進行一個項目編寫的時候,可能會有許多個模塊,如一個普通的互聯網sass雲辦公應用,會有用戶管理、部門管理、帳號管理等模塊,若是把全部的這些模塊都放在一個views.py文件之中,那麼最後views.py文件必然臃腫不堪,而且極難維護,所以flask中便有了blueprint的概念,能夠分別定義模塊的視圖、模板、視圖等等,咱們可使用blueprint進行不一樣模塊的編寫,不一樣模塊之間有着不一樣的靜態文件、模板文件、view文件,十分方便代碼的維護和管理,下面就是使用blueprint來進行上面用戶管理、部門管理、帳號管理模塊的模擬編寫,只涉及到api層面上,模板文件和靜態文件就不寫在上面了。javascript

二、分模塊後的結構java

在進行分模塊編寫接口以後,之前提供的接口就不能寫在一個views.py文件之中,具體結構以下所示:json

  • dept: 這是部門管理模塊,views是相應的接口文件。
  • user: 這是用戶管理模塊,同上,views是用戶管理的相應接口。

其餘的和以前的相似。flask

三、業務模塊api

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:sass

# 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,這個在隨後中會涉及到。app

另一個,我在獲取depts接口時,用的就不是jsonify方法了,而是內置的json.dumps轉換爲json對象,我之因此這樣寫,是由於jsonify若是要返回數組對象的話,必需要相應的對象實現一個方法返回json數據,或者將這個對象轉成字典類型,而後循環遍歷這個對象,比較麻煩,所以這裏我就直接使用json.dumps來進行轉換了。框架

在相應的路由註解上,我使用的就是dept.route,所以在定義了爲dept的blueprint對象後,這裏的做用至關於當初定義的app Flask對象,但實際上是進行了view層的路由後,最終仍是註冊到了app上面,在代碼層面上實現了不一樣模塊之間的隔離。模塊化

3.二、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.三、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在這些簡單的應用中還無需用到,講到後面再來講這些的做用。

四、運行

啓動run文件,進行運行,請求

http://localhost:5000/user/

結果:

第一個接口請求成功:

請求第二個接口:

http://localhost:5000/user/users

接口一樣請求成功,在這裏dept模塊就不去請求,結果是相似的。

五、總結

  • Blueprint其實自己只是對view上的接口進行了註冊,而後總體掛載在app上,Blueprint自己的目的就是組織多模塊的平行共存,避免直接在app上註冊view,其實更多的只是方便開發和代碼的維護,由於最終全部的views上的接口都仍然是直接掛載在app上,其實對應整個應用來講,沒有什麼明顯的區別。
  • Flask 中的Blueprint不是一個可插撥的應用,由於它不是一個真正的應用,而是一套能夠註冊 在應用中的操做,而且能夠註冊屢次。
  • 同時在這裏,咱們不能使用多個flask對象來管理和註冊,由於這樣會致使每一個flask對象都有一個本身的配置,很差管理。
  • 使用Blueprint,應用會在Flask層中進行管理,共享配置,經過註冊按需改變應用 對象。Blueprint的缺點是一旦應用被建立後,只有銷燬整個應用對象才能註銷lueprint。
  • 綜合以上,簡單來講,Blueprint就是經過url找到view的一套機制,並無太過於複雜的邏輯
  • url_for在使用時,若是要生成一個藍圖裏面的視圖對應的路由地址,則須要聲明當前藍圖名稱+視圖名稱 :url_for('users.home')
相關文章
相關標籤/搜索