Flask 進階藍圖(Blueprints)項目模塊化
藍圖(Blueprints)
? Flask使用藍圖的概念來制作應(yīng)用程序組件弹砚,并支持應(yīng)用程序或應(yīng)用程序中的通用模式双仍。藍圖可以大大簡化大型應(yīng)用程序的工作方式,并為Flask擴展程序在應(yīng)用程序上注冊操作提供了一個重要手段桌吃。Blueprint對象與Flask應(yīng)用程序?qū)ο蟮墓ぷ鞣绞筋愃浦煳郑珜嶋H上并不是應(yīng)用程序,相反茅诱,它的構(gòu)建或擴展應(yīng)用程序的藍圖逗物。
為什么需要使用藍圖呢
藍圖優(yōu)點:
- 將應(yīng)用程序分解為一組藍圖,這對于更大的應(yīng)用是更好的瑟俭。一個項目可以實例化一個應(yīng)用程序?qū)ο篝嶙浚跏蓟鄠€擴展,并注冊一組藍圖摆寄。
- 在URL前綴的應(yīng)用程序上注冊藍圖失暴,URL前綴的參數(shù)將成為藍圖中所有視圖函數(shù)的常見視圖參數(shù)坯门。
- 在具有不同URL規(guī)則的應(yīng)用程序中多次注冊藍圖。
- 通過藍圖提供模版過濾器逗扒,靜態(tài)文件田盈,模版和其他實用程序。藍圖不必實現(xiàn)應(yīng)用程序或查看功能缴阎。
- 在初始化Flask擴展時,在應(yīng)用程序中注冊這些藍圖简软。
Flask中的藍圖不是可插拔的應(yīng)用程序蛮拔,因為它實際上并不是一個應(yīng)用程序 - 它是一組可以在應(yīng)用程序中注冊的操作集,甚至可以多次執(zhí)行痹升。
Blueprints僅在Flask級別提供分離建炫,共享應(yīng)用程序配置,并可根據(jù)需要在注冊時更改應(yīng)用程序?qū)ο筇鄱辍H秉c是一旦創(chuàng)建應(yīng)用程序就無法取消注冊藍圖肛跌,而需要取消就只有銷毀整個應(yīng)用程序?qū)ο蟆?/p>
簡單的說,藍圖記錄了應(yīng)用程序執(zhí)行注冊后的操作察郁。Flask在調(diào)度請求時衍慎,將一個端點到另一個端點的URL視圖函數(shù)與藍圖進行關(guān)聯(lián)起來。
將項目模塊化
首先我們先將項目的骨架搭建起來皮钠。
[tianjun@localhost Flask_TTC]$ tree
.
├── App # App應(yīng)用程序 Flask對象
│ ├── Admin # 分塊的Admin模塊稳捆, 后臺模塊
│ │ ├── __init__.py # Admin模塊初始化文件,創(chuàng)建admin藍圖對象
│ │ ├── models.py # 數(shù)據(jù)庫模型文件
│ │ └── views.py # 邏輯控制文件
│ ├── Index # 分塊的Index模塊麦轰, 前臺模塊
│ │ ├── __init__py # Index模塊初始文件乔夯,創(chuàng)建index藍圖對象
│ │ ├── models.py # 數(shù)據(jù)庫模型文件
│ │ └── views.py # 邏輯控制文件
│ └── __init__.py # App模塊初始化文件,主要對db和app創(chuàng)建的方法
├── config.py # 項目配置文件
├── manager.py # 項目啟動文件
├── static # 靜態(tài)文件
├── templates # 模板文件
├── test # 測試文件放置位置
└── utils # 工具文件
├── functions.py
└── __init__.py
5 directories, 11 files
先對配置文件進編寫
config.py
import os
BASE_DIR = os.getcwd() # 項目的絕對路徑
TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates') # 模板文件的路徑
STATICFILES_DIR = os.path.join(BASE_DIR, 'static') # 靜態(tài)文件的路徑
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/ttc' # 數(shù)據(jù)庫URI
SQLALCHEMY_TRACK_MODIFICATIONS = False # 查詢跟蹤款侵,不太需要末荐,F(xiàn)alse,不占用額外的內(nèi)存
然后在App模塊中的__init__.py
文件中編寫對Flask對象進行創(chuàng)建的方法新锈,初始化SQLAlchemy對象
App/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import SQLALCHEMY_DATABASE_URI甲脏, SQLALCHEMY_TRACK_MODIFICATIONS
db = SQLAlchemy() # 初始化SQLAlchemy
def create_app():
""" 創(chuàng)建app的方法 """
app = Flask(__name__) # 生成Flask對象
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI # 配置app的URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_TRACK_MODIFICATIONS
db.init_app(app=app) # SQLAlchemy初始化App
# 在這還可以設(shè)置好配置后, 初始化其他的模塊
return app # 返回Flask對象app
接著在Index模塊中創(chuàng)建藍圖
App/Index/__init__.py
from flask import Blueprint
from config import TEMPLATES_DIR, STATICFILES_DIR
index = Blueprint('index', __name__,
template_folder=TEMPLATES_DIR,
static_folder=STATICFILES_DIR) # 創(chuàng)建一個藍圖對象壕鹉,設(shè)置別名剃幌,模板文件地址,靜態(tài)文件地址
from App.Index import views # 這里導(dǎo)入是為了在解釋時晾浴,藍圖能加載到views文件中的路由數(shù)據(jù)
再接著在views.py中為藍圖設(shè)置路由
from App.Index import index # 獲取藍圖
from App.Index.models import * # 獲取數(shù)據(jù)庫模型對象和SQLAlchemy對象db负乡,注意不可使用App模塊中的db
@index.route('/') # 設(shè)置路由
def index(): # 執(zhí)行的方法
return 'This Page Is Index'
(Admin模塊藍圖的創(chuàng)建方法和上述過程相似不做過多描述)
最后在manager.py文件中對藍圖進行注冊
from flask_script import Manager
from App import create_app
from App.Index import index
from App.Admin import admin
app = create_app() # 創(chuàng)建app
app.register_blueprint(index, url_prefix='/index') # 注冊藍圖
app.register_blueprint(admin, url_prefix='/admin') # 注冊藍圖
manager = Manager(app) # 通過app創(chuàng)建manager對象
if __name__ == '__mian__':
manager.run() # 運行服務(wù)器
注意
在這里一定要嚴(yán)格在遵守Python導(dǎo)入包的編寫順序
- Python Build In 內(nèi)構(gòu)包
- Python 第三方庫
- 用戶自定義模塊
好了配置為完成,運行服務(wù)器
(venv) [tianjun@localhost Flask_TTC]$ python manager.py runserver -h 127.0.0.1 -p 5000 -d
* Serving Flask app "App" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 244-604-680
訪問頁面