1. 程式人生 > >使用Flask快速開發WEB應用-第二篇:Blueprint模組的應用

使用Flask快速開發WEB應用-第二篇:Blueprint模組的應用

轉自:http://www.easywu.com/?p=306

看了之後可以對Blueprint的用法和程式的框架有所瞭解。

一個網站根據不同的功能可能會分為多個不同的模組,如果把所有功能都寫在一個檔案裡,後期將會很難維護。上一篇裡面講到了怎樣構建一個最小的Flask應用,這一篇的內容重寫了WEB應用的框架,使用Blueprint來註冊不同功能的模組

這一篇裡我將會把網站功能分為兩個部份,frontend為一些常用資訊功能,admin為管理員功能。兩個功能分別寫入不同的PY檔案裡通過Blueprint註冊成為網站功能繫結URL地址。先看一下檔案結構:

我用火影的名字作為檔名,哈哈 : )這完全是個人愛好。最愛的OnePiece早就被我用於公司的專案,只能拿火影來用。sasuke作為專案名,是佐助的名字@

[email protected]

現在來分析一下檔案結構:
naruto資料夾包含:
資料夾:sasuke Python包(WEB應用的所有內容)。
檔案:run.py管理整個WEB應用的執行。

首先來看看run.py的程式碼:

#!/usr/bin/env python
#coding=utf-8
__author__ = 'kainwu'
 
#匯入Flask
from flask import Flask
 
#匯入sasuke中的create_app
from sasuke import create_app
 
#初始化Flask放在sasuke裡面通過create_app建立
app = create_app()   def main(): #設定伺服器ip server_ip = '0.0.0.0' #設定伺服器埠 server_port = 8000 #執行Flask app.run(host=server_ip, port=server_port, debug=True)   if __name__ == '__main__': main()

這一段程式碼在上一篇中已經介紹過,不同的地方是把Flask初始化放在create_app函式裡面。

sasuke是一個標準的Python包(任何一個包含有__init__.py檔案的資料夾都會被認定為Python包,並且會從__init__.py中執行程式碼進行初始化。

)再看看sasuke包裡面的views,views也是一個Python包,同樣會讀取__init__.py進行初始化,我們現在看看views裡面__init__.py的程式碼:

#!/usr/bin/env python
#coding=utf-8
__author__ = 'kainwu'
 
from .frontend import frontend
from .admin import admin

可以看出__init__.py只做一件事,從views包裡面的admin檔案中匯入admin,從frontend檔案中匯入frontend。這樣外層程式就可以通過views.frontend來訪問frontend.py裡面的frontend, 通過views.admin來訪問admin.py裡面的admin。

看看admin.py中的程式碼:

#!/usr/bin/env python
#coding=utf-8
__author__ = 'kainwu'
 
from flask import Blueprint
 
admin = Blueprint('admin', __name__)
 
@admin.route('/')
def index():
    return 'admin'
 
@admin.route('/test/')
def test():
    return 'admin/test/'

frontend.py中的程式碼:

#!/usr/bin/env python
#coding=utf-8
__author__ = 'kainwu'
 
from flask import Blueprint, render_template
 
frontend = Blueprint('frontend', __name__)
 
@frontend.route('/')
def index():
    return 'frontend'
 
@frontend.route('/test/')
def test():
    return '/test/'

可以看出admin.py與frontend.py中的程式碼很相似,其中有一段程式碼我們看到了Blueprint:
admin = Blueprint(‘admin’, __name__)
用於定義Blueprint模組,Blueprint模組可以用來定義路由,通過@admin.route(‘/’)來定義路由(URL地址),或許你還不明白這裡定義了一個Blueprint物件admin除了新增路由外還有何用處,不急,下面我們來看看sasuke包中的__init__.py裡的程式碼:

#!/usr/bin/env python
#coding=utf-8
__author__ = 'kainwu'
 
from flask import Flask
from views import frontend, admin
 
DEFAULT_APP_NAME = 'NARUTO'
 
DEFAULT_MODULES = (
(frontend, ''),
(admin, '/admin'),
)
 
def create_app():
    """ 建立、初始化app """
    app = Flask(DEFAULT_APP_NAME)
    # 使用flask中的Blueprint設定站點模組
    setting_modules(app, DEFAULT_MODULES)
    return app
 
def setting_modules(app, modules):
    """ 註冊Blueprint模組 """
    for module, url_prefix in modules:
    # 通過register_blueprint註冊
    app.register_blueprint(module, url_prefix = url_prefix)

重點看這裡:

for module, url_prefix in modules:
    app.register_blueprint(module, url_prefix = url_prefix)

通過傳遞兩個引數至register_blueprint方法註冊Blueprint。根據傳遞過來的引數module是admin與frontend,而admin與frontend是已經定義好的Blueprint物件。url_prefix為繫結的url路徑,看到這裡是不是赫然開朗起來了?

舉個例子,如果你需要另外加一個模組用於管理商店,那麼可以通過以下幾個步驟新增:
1、在views包裡面新建一個shop.py,定義一個Blueprint的物件shop
2、匯入到__init__.py裡面。
3、在sasuke包的__init__.py中匯入shop
4、DEFAULT_MODULES中新增(shop, ‘/shop’)