flask藍圖的使用

首先,我對藍圖的理解相對通俗,就是以爲藍圖對於視圖方法模塊化、大項目協同開發過程當中的一個很好的工具.css

1.下圖是咱們一般狀況下使用的項目組織結構html

看一下視圖方法:python

複製代碼
#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(藍圖)就派上用場了

什麼是藍圖?

 
 

一個藍圖定義了可用於單個應用的視圖,模板,靜態文件等等的集合。flask

 
 

我何時會用到藍圖?

 
 

藍圖的殺手鐗是將你的應用組織成不一樣的組件,好比把這裏的admin,user相關的視圖方法分爲兩個組件,一個是admin組件,一個是user組件.這時咱們能夠瀏覽器

建立兩個藍圖實現這兩個獨立的組件.app

複製代碼

 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.類並用參數和初始化。import_name一般用,一個表示當前模塊的特殊的Python變量,做爲的取值。Blueprint()nameimport_name__name__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的代碼都寫到一個文件中去,這裏咱們不在舉例,說明.

相關文章
相關標籤/搜索