首先,我對藍圖的理解相對通俗,就是覺得藍圖對於視圖方法模塊化、大項目協同開發過程中的一個很好的工具.
1.下圖是我們通常情況下使用的項目組織結構
看一下視圖方法:
#views.py
1 from app import app 2 3 4 @app.route('/user/index') 5 def index(): 6 return 'user_index' 7 8 @app.route('/user/show') 9 def show(): 10 return 'user_show' 11 12 @app.route('/user/add') 13 def add(): 14 return 'user_add' 15 16 @app.route('/admin/index') 17 def adminindex(): 18 return 'admin_index' 19 20 @app.route('/admin/show') 21 def adminshow(): 22 return 'admin_show' 23 24 @app.route('/admin/add') 25 def adminadd(): 26 return 'admin_add'
#從視圖方法中,我們看到有6個視圖,分別對應admin,user兩個不同用戶的3個功能index,add,show.
這樣寫顯然沒問題,但是明顯與python提倡的模塊化,優雅的代碼特點相違背,即不是很python的python代碼.
讓我們在這里假想兩個問題:
1.如果admin和user不止只有3個功能呢,比如好幾百個,導致views的代碼量已經達到了上萬行?
2.如果我們有多個同事分工開發admin,user和其它可能的模塊呢,都同時往一個views里寫代碼嗎,在做版本控制時,提交過程中頻繁出現提交沖突了怎么辦?
3.加入我們要拋棄admin或者user功能塊時怎么辦,要一一手動刪除所有admin或是user相關的代碼嗎,這樣當然可以,但是會不會太low呢?
當然根據Pythonic特點,我們肯定希望盡可能的把代碼盡量的模塊化,讓我們的代碼看起來更加的優雅和順暢,這個時候flask.Blueprint(藍圖)就派上用場了
什么是藍圖?
一個藍圖定義了可用於單個應用的視圖,模板,靜態文件等等的集合。
我什么時候會用到藍圖?
藍圖的殺手鐧是將你的應用組織成不同的組件,比如把這里的admin,user相關的視圖方法分為兩個組件,一個是admin組件,一個是user組件.這時我們可以
創建兩個藍圖實現這兩個獨立的組件.
2.我們如何使用藍本將上述的視圖方法看上去更加pythonic呢?
由於上面的例子中只有兩個組件(模塊)admin,user,我們可以創建名為admin.py和user.py的兩個文件,分別在里面創建兩個藍圖的實例對象admin,user.
直接上代碼:
#admin.py
#admin.py from flask import Blueprint,render_template, request admin = Blueprint('admin',__name__) @admin.route('/index') def index(): return render_template('admin/index.html') @admin.route('/add') def add(): return 'admin_add' @admin.route('/show') def show(): return 'admin_show'
#要想創建一個藍圖對象,你需要import flask.Blueprint()
類並用參數name
和import_name
初始化。import_name通常用__name__
,一個表示當前模塊的特殊的Python變量,作為import_name
的取值。
#user.py
from flask import Blueprint, render_template, redirect user = Blueprint('user',__name__) @user.route('/index') def index(): return render_template('user/index.html') @user.route('/add') def add(): return 'user_add' @user.route('/show') def show(): return 'user_show'
好了,視圖函數已經分開了,我們如何使用它們的呢?再來看一下我們的views.py變成了什么樣吧?
#views.py
from app import app from .admin import admin from .user import user #這里分別給app注冊了兩個藍圖admin,user
#參數url_prefix='/xxx'的意思是設置request.url中的url前綴,
#即當request.url是以/admin或者/user的情況下才會通過注冊的藍圖的視圖方法處理請求並返回
app.register_blueprint(admin,url_prefix='/admin') app.register_blueprint(user, url_prefix='/user')
#現在我們的views是否已經變得很簡單了呢?順便回答第三個問題,如果想棄用某一個組件(模塊)我們只需要相對應的注釋掉給app注冊藍圖的行即可.
#細心的伙伴還可以發現,在views.py中在使用默認endpoint的前提下,我們是沒有辦法使用同一個視圖方法名的(當然我們也不建議在同一個文件中有兩個視圖方法名相同,
#盡管指向他們的request.url不同),但是使用了藍圖之后我們就可以在不同模塊中使用相同的方法名了,例如add,show..
3.到此我們就可以通過瀏覽器測試我們的程序
4.附上使用藍圖后的項目組織結構
當然如果項目不大的話就沒有什么必要使用藍圖了,甚至我們可以把除了所有css,js,html的代碼都寫到一個文件中去,這里我們不在舉例,說明.