參考css
flask挺挺輕巧的, 所以玩一玩它. 若是用它作大型點的項目, 就用到了它的藍圖組織項目. 一時半會不太清楚這玩意怎麼用, 得擼一擼py基礎了.html
我搞了個movie小的flask栗子來用用藍圖小功能, git地址以下.
項目分前臺 home, 後臺admin模塊.使用藍圖來組織.python
https://github.com/lannyMa/moviegit
首先,我對藍圖的理解相對通俗,就是以爲藍圖對於視圖方法模塊化、大項目協同開發過程當中的一個很好的工具.github
看一下視圖方法:flask
#views.py from app import app @app.route('/user/index') def index(): return 'user_index' @app.route('/user/show') def show(): return 'user_show' @app.route('/user/add') def add(): return 'user_add' @app.route('/admin/index') def adminindex(): return 'admin_index' @app.route('/admin/show') def adminshow(): return 'admin_show' @app.route('/admin/add') def adminadd(): return 'admin_add'
從視圖方法中,咱們看到有6個視圖,分別對應admin,user兩個不一樣用戶的3個功能index,add,show.
這樣寫顯然沒問題,可是明顯與python提倡的模塊化,優雅的代碼特色相違背,即不是很python的python代碼.瀏覽器
讓咱們在這裏假想兩個問題:app
固然根據Pythonic特色,咱們確定但願儘量的把代碼儘可能的模塊化,讓咱們的代碼看起來更加的優雅和順暢,這個時候flask.Blueprint(藍圖)就派上用場了模塊化
一個藍圖定義了可用於單個應用的視圖,模板,靜態文件等等的集合。函數
藍圖的殺手鐗是將你的應用組織成不一樣的組件,好比把這裏的admin,user相關的視圖方法分爲兩個組件,一個是admin組件,一個是user組件.這時咱們能夠
建立兩個藍圖實現這兩個獨立的組件.
# 2.咱們如何使用藍本將上述的視圖方法看上去更加pythonic呢?
因爲上面的例子中只有兩個組件(模塊)admin,user,咱們能夠建立名爲admin.py和user.py的兩個文件,分別在裏面建立兩個藍圖的實例對象admin,user.
直接上代碼:
#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註冊藍圖的行便可.
儘管指向他們的request.url不一樣),可是使用了藍圖以後咱們就能夠在不一樣模塊中使用相同的方法名了,例如add,show..
固然若是項目不大的話就沒有什麼必要使用藍圖了,甚至咱們能夠把除了全部css,js,html的代碼都寫到一個文件中去,這裏咱們不在舉例,說明.