flask四、進階藍圖(Blueprints)項目模塊化

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)入包的編寫順序

  1. Python Build In 內(nèi)構(gòu)包
  2. Python 第三方庫
  3. 用戶自定義模塊

好了配置為完成,運行服務(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

訪問頁面


這里寫圖片描述

參考文檔

Flask Blueprints

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脊凰,一起剝皮案震驚了整個濱河市抖棘,隨后出現(xiàn)的幾起案子茂腥,更是在濱河造成了極大的恐慌,老刑警劉巖切省,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件最岗,死亡現(xiàn)場離奇詭異,居然都是意外死亡朝捆,警方通過查閱死者的電腦和手機般渡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芙盘,“玉大人驯用,你說我怎么就攤上這事∪謇希” “怎么了蝴乔?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驮樊。 經(jīng)常有香客問我薇正,道長,這世上最難降的妖魔是什么囚衔? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任挖腰,我火速辦了婚禮,結(jié)果婚禮上练湿,老公的妹妹穿的比我還像新娘曙聂。我一直安慰自己,他們只是感情好鞠鲜,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布宁脊。 她就那樣靜靜地躺著,像睡著了一般贤姆。 火紅的嫁衣襯著肌膚如雪榆苞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天霞捡,我揣著相機與錄音坐漏,去河邊找鬼。 笑死碧信,一個胖子當(dāng)著我的面吹牛赊琳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砰碴,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼躏筏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了呈枉?” 一聲冷哼從身側(cè)響起趁尼,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤埃碱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酥泞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砚殿,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年芝囤,在試婚紗的時候發(fā)現(xiàn)自己被綠了似炎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡悯姊,死狀恐怖名党,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挠轴,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布耳幢,位于F島的核電站岸晦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏睛藻。R本人自食惡果不足惜启上,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望店印。 院中可真熱鬧冈在,春花似錦、人聲如沸按摘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炫贤。三九已至溅固,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兰珍,已是汗流浹背侍郭。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掠河,地道東北人亮元。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像唠摹,于是被迫代替她去往敵國和親爆捞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • 22年12月更新:個人網(wǎng)站關(guān)停勾拉,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,186評論 22 257
  • flask是python的一個web應(yīng)用框架嵌削,django很多人聽過毛好,flask比較少見,連創(chuàng)始人一開始寫出來只是...
    思而憂閱讀 2,943評論 0 5
  • 1苛秕,藍圖定義: Flask 用 藍圖(blueprints) 的概念來在一個應(yīng)用中或跨應(yīng)用制作應(yīng)用組件和支持通用的...
    曉可加油閱讀 833評論 0 0
  • 什么是藍圖肌访? 一個藍圖定義了視圖,模板艇劫,靜態(tài)文件以及可以用于應(yīng)用程序的其它元素的集合吼驶。例如,讓我們假設(shè)下我們有一個...
    邪惡的Sheldon閱讀 1,237評論 0 1
  • 在合理的時間干完車 之后把衛(wèi)生區(qū)從新都打掃了下 看著也就舒服多了
    呵呵_206a閱讀 80評論 0 0