在上篇文章我們學(xué)習(xí)了Flask框架——模板復(fù)用(繼承、包含绳姨、宏)登澜,這篇文章我們來(lái)學(xué)習(xí)Flask框架——藍(lán)圖、命令行工具flask-script飘庄。
藍(lán)圖
在一個(gè)完整的Flask應(yīng)用程序中脑蠕,肯定會(huì)有很多視圖函數(shù),例如:用Flask框架寫(xiě)的購(gòu)物網(wǎng)站中跪削,會(huì)有和用戶谴仙、商品、評(píng)論相關(guān)聯(lián)的視圖函數(shù)碾盐,把所有視圖函數(shù)都放在一個(gè)py文件中肯定是不可取的晃跺,管理起來(lái)會(huì)非常不方便。
這時(shí)我們可以把視圖函數(shù)進(jìn)行模塊化處理毫玖,把用戶視圖函數(shù)掀虎、商品視圖函數(shù)、評(píng)論視圖函數(shù)分為用戶模塊付枫、商品模塊和評(píng)論模塊烹玉。Flask框架內(nèi)置了一個(gè)模塊化處理的類——Blueprint藍(lán)圖。
Blueprint藍(lán)圖是一種組織一組相關(guān)視圖及其他代碼的方式阐滩。與把視圖及其他代碼直接注冊(cè)到應(yīng)用的方式不同二打,藍(lán)圖方式是把它們注冊(cè)到藍(lán)圖,然后在工廠函數(shù)中把藍(lán)圖注冊(cè)到應(yīng)用掂榔。
簡(jiǎn)單來(lái)說(shuō)就把視圖函數(shù)按功能分為很多個(gè)小模塊继效,這些小模塊調(diào)用Blueprint類后稱為藍(lán)圖症杏,一般情況下,我們都是把藍(lán)圖放在包里莲趣,把藍(lán)圖注冊(cè)到app應(yīng)用中鸳慈,這樣就實(shí)現(xiàn)了模塊化處理,如下圖所示:
接下來(lái)我們通過(guò)Flask項(xiàng)目來(lái)演示如何使用創(chuàng)建喧伞、使用藍(lán)圖走芋。
創(chuàng)建Flask項(xiàng)目目錄如下所示:
這里創(chuàng)建一個(gè)apps包,在apps包中我們創(chuàng)建了goods潘鲫、user包分別用來(lái)存放goods視圖函數(shù)文件和user視圖函數(shù)文件翁逞。
用user包為例,在user包中創(chuàng)建名為view的py文件溉仑,該文件用來(lái)編寫(xiě)視圖函數(shù)挖函,view.py示例代碼如下所示:
from flask import Blueprint
user_bp= Blueprint('user',__name__) #藍(lán)圖實(shí)例化對(duì)象
@user_bp.route('/hello') #路由裝飾器
def hello_world(): #視圖函數(shù)
return 'hello world' #返回hello world字符串
使用Blueprint()方法獲取到藍(lán)圖對(duì)象user_bp,和之間的Flask程序路由裝飾器不同浊竟,該路由裝飾器為:
藍(lán)圖實(shí)例化對(duì)象.route()
注意:apps包的init.py初始化文件與static靜態(tài)文件夾怨喘、templates模板文件夾不在同一級(jí),所以需要在Blueprint()方法中傳遞template_folder和static_folder參數(shù)振定,告訴該視圖函數(shù)在哪里找靜態(tài)文件夾和模板文件夾必怜,代碼如下所示:
user_bp= Blueprint('user',__name__,template_folder='../templates',static_folder='../static')
但一般來(lái)說(shuō),我們不會(huì)在Blueprint()方法中傳遞template_folder和static_folder后频,一般在apps包中的init.py初始化文件中傳入template_folder和static_folder參數(shù)梳庆,示例代碼如下所示:
from flask import Flask
from apps.user.view import user_bp
def create_app():
#設(shè)置靜態(tài)文件夾和模板文件夾的路徑
app=Flask(__name__,template_folder='../templates',static_folder='../static')
app.register_blueprint(user_bp) #注冊(cè)藍(lán)圖
return app #返回Flask對(duì)象
在init.py初始化文件中自定義一個(gè)create_app()方法,并在方法中使用Flask卑惜,獲取Flask類實(shí)例對(duì)象app膏执,這樣我們就不需要在啟動(dòng)文件app.py文件中使用Flask,啟動(dòng)app.py文件就很簡(jiǎn)潔了露久,使用register_blueprint()方法注冊(cè)藍(lán)圖更米。
啟動(dòng)文件app.py代碼如下所示:
from apps import create_app
app=create_app() #調(diào)用init.py初始文件的create_app()方法
if __name__ == '__main__':
app.run()
啟動(dòng)文件很簡(jiǎn)潔,就調(diào)用create_app()和一個(gè)啟動(dòng)run()方法毫痕。
啟動(dòng)Flask項(xiàng)目壳快,訪問(wèn)http://127.0.0.1:5000/hello,網(wǎng)頁(yè)就會(huì)顯示hello world镇草。
這樣我們就成功使用了藍(lán)圖。
flask-script
flask-script是一個(gè)支持自定義命令的工具瘤旨,為Flask程序添加了一個(gè)命令行解析器梯啤,可以讓程序從命令行直接執(zhí)行相應(yīng)的程序。
flask-script支持在Flask中編寫(xiě)外部腳本存哲,這包括運(yùn)行開(kāi)發(fā)服務(wù)器因宇、定制python-shell七婴、設(shè)置數(shù)據(jù)庫(kù)的腳本、cronjobs和其他屬于web應(yīng)用程序本身之外的命令行任務(wù)察滑。
其安裝方式如下所示:
pip install flask-script
將flask-script繼承在Flask項(xiàng)目app.py中打厘,其代碼如下所示:
from flask import Flask
from flask_script import Manager #導(dǎo)入Manager方法
app = Flask(__name__)
manager = Manager(app) # 將命令行綁定在app應(yīng)用中
@app.route('/')
def index():
return 'hello world'
if __name__ == "__main__"
manager.run()
我們依舊在命令行中執(zhí)行下面代碼來(lái)啟動(dòng)flask程序的app,代碼如下所示:
app.py
運(yùn)行結(jié)果如下圖所示:
我們發(fā)現(xiàn)flask程序沒(méi)有被啟動(dòng)贺辰,這是因?yàn)槭裁茨兀?/p>
運(yùn)行結(jié)果圖中的大概意思是執(zhí)行代碼app.py中后面缺少了一些命令户盯,這些命令可以是shell、runserver饲化,也可以通過(guò)--help來(lái)獲取命令的幫助莽鸭。其中:
- shell:在Flask程序中運(yùn)行一個(gè)Python腳本;
- runserver:?jiǎn)?dòng)flask程序服務(wù)器吃靠。
由于我們通過(guò)Manager()方法將命令行綁定在app應(yīng)用中硫眨,所以需要命令行執(zhí)行下面代碼來(lái)啟動(dòng)flask程序:
app.py runserver
運(yùn)行結(jié)果如下所示:
這樣就成功啟動(dòng)了flask程序了,接下來(lái)我們看看app.py runserver后面還可以接什么命令巢块,如下圖所示:
在app.py runserver后面可以接以下命令:
[-?] [-h HOST] [-p PORT] [--threaded] [--processes PROCESSES] [--passthrough-errors] [-d] [-D] [-r] [-R] [--ssl-crt SSL_CRT] [--ssl-key SSL_KEY]
這里就不一一解釋每個(gè)命令的作用了礁阁。
我們舉個(gè)簡(jiǎn)單的例子,修改flask服務(wù)的端口號(hào)族奢,命令行執(zhí)行代碼如下所示:
app.py runserver -p 8080
這樣就成功修改了flask服務(wù)的端口號(hào)姥闭。
除了flask-script自帶的shell,runserver命令之外歹鱼,我們還可以自定義flask-script命令泣栈,其代碼如下所示:
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
manager=Manager(app)
@manager.command
def welcome(): #自定義flask-script
print('welcome')
if __name__ == '__main__':
manager.run()
這里我們通過(guò)manager.command()來(lái)添加welcome到flask-scrip命令中,命令行輸入app.py弥姻,如下圖所示:
我們發(fā)現(xiàn)在圖中多了welcome這個(gè)命令南片,命令行執(zhí)行app.py welcome,如下圖所示:
這樣就成功自定義命令了庭敦。
好了疼进,F(xiàn)lask框架——藍(lán)圖、命令行工具flask-script就講到這里了秧廉,下篇文章學(xué)習(xí)Flask框架——數(shù)據(jù)庫(kù)配置及遷移同步伞广,感謝觀看!L鄣纭嚼锄!
公眾號(hào):白巧克力LIN