Python學(xué)習(xí)之解析Flask運(yùn)行原理(圖文詳解)_第1頁(yè)
Python學(xué)習(xí)之解析Flask運(yùn)行原理(圖文詳解)_第2頁(yè)
Python學(xué)習(xí)之解析Flask運(yùn)行原理(圖文詳解)_第3頁(yè)
Python學(xué)習(xí)之解析Flask運(yùn)行原理(圖文詳解)_第4頁(yè)
Python學(xué)習(xí)之解析Flask運(yùn)行原理(圖文詳解)_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Python學(xué)習(xí)之解析Flask運(yùn)行原理(圖文詳解)所有的PythonWeb框架都要遵循WSGI協(xié)議,在這里還是要簡(jiǎn)單回顧一下WSGI的核心概念。

WSGI中有一個(gè)非常重要的概念:每個(gè)PythonWeb應(yīng)用都是一個(gè)可調(diào)用(callable)的對(duì)象。在flask中,這個(gè)對(duì)象就是app=Flask(name)創(chuàng)建出來(lái)的app,就是下圖中的綠色Application部分。要運(yùn)行web應(yīng)用,必須有webserver,比如我們熟悉的apache、Nginx,或者python中的gunicorn,我們下面要講到的werkzeug提供的WSGIServer,它們是下圖的黃色Server部分。

Server和Application之間怎么通信,就是WSGI的功能。它規(guī)定了app(environ,start_response)的接口,server會(huì)調(diào)用application,并傳給它兩個(gè)參數(shù):environ包含了請(qǐng)求的所有信息,start_response是application處理完之后需要調(diào)用的函數(shù),參數(shù)是狀態(tài)碼、響應(yīng)頭部還有錯(cuò)誤信息。

WSGIapplication非常重要的特點(diǎn)是:它是可以嵌套的。換句話說(shuō),可以寫個(gè)application,它做的事情就是調(diào)用另外一個(gè)application,然后再返回(類似一個(gè)proxy)。一般來(lái)說(shuō),嵌套的最后一層是業(yè)務(wù)應(yīng)用,中間就是middleware。這樣的好處是,可以解耦業(yè)務(wù)邏輯和其他功能,比如限流、認(rèn)證、序列化等都實(shí)現(xiàn)成不同的中間層,不同的中間層和業(yè)務(wù)邏輯是不相關(guān)的,可以獨(dú)立維護(hù);而且用戶也可以動(dòng)態(tài)地組合不同的中間層來(lái)滿足不同的需求。

Flask基于WerkzeugWSGI工具箱和Jinja2模板引擎。Flask使用BSD授權(quán)。Flask也被稱為microframework,因?yàn)樗褂煤?jiǎn)單的核心,用extension增加其他功能。Flask沒有默認(rèn)使用的數(shù)據(jù)庫(kù)、窗體驗(yàn)證工具。然而,F(xiàn)lask保留了擴(kuò)增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗(yàn)證工具、文件上傳、各種開放式身份驗(yàn)證技術(shù)。我們可以這么理解,F(xiàn)lask是一個(gè)核心,而其他功能則是一些插件,需要什么功能,只要找到對(duì)應(yīng)的插件,將其插入核心就能夠?qū)崿F(xiàn)該功能了。

Flask是怎么將代碼轉(zhuǎn)換為我們可見的Web網(wǎng)頁(yè)的。首先,我們得先從Web程序的一般流程來(lái)看,對(duì)于我們的Web應(yīng)用來(lái)說(shuō),當(dāng)客戶端想要獲取動(dòng)態(tài)資源時(shí),(比如ASP和PHP這類語(yǔ)言寫的網(wǎng)站),這個(gè)時(shí)候就會(huì)發(fā)起一個(gè)HTTP請(qǐng)求(比如用瀏覽器訪問一個(gè)URL),此時(shí)Web應(yīng)用程序就會(huì)在服務(wù)器后臺(tái)進(jìn)行相應(yīng)的業(yè)務(wù)處理(比如對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作或是進(jìn)行一些計(jì)算操作等),取出用戶需要的數(shù)據(jù),生成相應(yīng)的HTTP響應(yīng)(當(dāng)然,如果訪問的是靜態(tài)資源,服務(wù)器則會(huì)直接返回用戶所需的資源,不會(huì)進(jìn)行業(yè)務(wù)處理)。整個(gè)處理工程如下所示:

在實(shí)際的應(yīng)用中,不同的請(qǐng)求可能會(huì)調(diào)用相同的處理邏輯。這里有著相同業(yè)務(wù)處理邏輯的HTTP請(qǐng)求可以用一類URL來(lái)標(biāo)識(shí)。比如在我們的博客站點(diǎn)中,對(duì)于所有想要獲取Articles內(nèi)容的請(qǐng)求而言,可以用articles/這類URL來(lái)表示,這里的article_id用以區(qū)分不同的article。接著在后臺(tái)定義一個(gè)get_article(article_id)的函數(shù),用來(lái)獲取article相應(yīng)的數(shù)據(jù),此外還需要建立URL和函數(shù)之間的一一對(duì)應(yīng)關(guān)系。這就是Web開發(fā)中所謂的路由分發(fā),如下圖所示:

在Flask中,使用werkzeug來(lái)做路由分發(fā),werkzeug是Flask使用的底層WSGI庫(kù)(WSGI,全稱WebServerGatewayinterface,或者PythonWebServerGatewayInterface,是為Python語(yǔ)言定義的Web服務(wù)器和Web應(yīng)用程序之間的一種簡(jiǎn)單而通用的接口)。

WSGI將Web服務(wù)分成兩個(gè)部分:服務(wù)器和應(yīng)用程序。WGSI服務(wù)器只負(fù)責(zé)與網(wǎng)絡(luò)相關(guān)的兩件事:接收瀏覽器的HTTP請(qǐng)求、向?yàn)g覽器發(fā)送HTTP應(yīng)答;而對(duì)HTTP請(qǐng)求的具體處理邏輯,則通過調(diào)用WSGI應(yīng)用程序進(jìn)行。WSGI工作流程如下圖所示:

在Flask中,路由分發(fā)的代碼寫起來(lái)十分簡(jiǎn)單,如下:

#管理員注銷頁(yè)面

@mAIn.route(/logout)

deflogout():

dm=DataManager()

currentUsers=dm.getUsers(0)

print(currentUsers[0])

returnrender_template(currentUsers.html,users=currentUsers)

通過業(yè)務(wù)邏輯函數(shù)獲得我們所需的數(shù)據(jù)后,服務(wù)器將會(huì)根據(jù)這些數(shù)據(jù)來(lái)生成HTTP響應(yīng)(對(duì)于Web應(yīng)用來(lái)說(shuō),一般就是一個(gè)HTML文件,這個(gè)是可以直接被我們的客戶端,即瀏覽器直接讀取并解釋的)。在Web開發(fā)中,常規(guī)的做法是將獲取的數(shù)據(jù)傳入Web應(yīng)用提供的一個(gè)HTML模板文件中,經(jīng)過模板系統(tǒng)的渲染后最終得到我們所需要的HTML響應(yīng)文件。

一般情況下,雖然請(qǐng)求不同,但是響應(yīng)中的數(shù)據(jù)的展示方式是相同的,通俗點(diǎn)說(shuō)就是除了我們請(qǐng)求獲得的數(shù)據(jù)不一樣外,其他都是一樣的,那么我們就可以設(shè)計(jì)一個(gè)模板(除了數(shù)據(jù)內(nèi)容可以改動(dòng),其他都是固定的HTML文件)。我們以博客站點(diǎn)為例,對(duì)不同article而言,其具體articlecontent雖然不同,但頁(yè)面展示的內(nèi)容除了請(qǐng)求的數(shù)據(jù)外都是一樣的,都有標(biāo)題攔,內(nèi)容欄等。也就是說(shuō),對(duì)于article來(lái)說(shuō),我們只需提供一個(gè)HTML模板,然后傳入不同article數(shù)據(jù),即可得到不同的HTTP響應(yīng)。這就是所謂的模板渲染,如下圖所示:

在Flask中使用Jinja2模板渲染引擎來(lái)做模板渲染(Jinja2是基于python的模板引擎,功能比較類似于于PHP的smarty,J2ee的Freemarker和velocity。它能完全支持unicode,并具有集成的沙箱執(zhí)行環(huán)境,應(yīng)用廣泛。jinja2使用BSD授權(quán))。Jinja2的工作流程如下圖所示:

在Flask中,模板渲染的代碼寫起來(lái)也是十分的便捷,代碼如下:

@app.route(/articles/int:article_id/)

defget_article(article_id):

returnrender_template(path/to/template.html,data_needed)

在Flask中,我們處理一個(gè)請(qǐng)求的流程就是,首先根據(jù)用戶提交的URL來(lái)決定由哪個(gè)業(yè)務(wù)邏輯函數(shù)來(lái)處理,然后在函數(shù)中進(jìn)行操作,取得所需的數(shù)據(jù)。再將取得的數(shù)據(jù)傳給相應(yīng)的模板文件中,由Jinja2負(fù)責(zé)渲染得到HTTP響應(yīng)內(nèi)容,即HTTP響應(yīng)的HTML文件,然后由Flask返回響應(yīng)內(nèi)容。

下面主要以實(shí)例項(xiàng)目對(duì)Flask運(yùn)行原理做一簡(jiǎn)要解析。在實(shí)例項(xiàng)目中,使用到了程序工廠函數(shù)和藍(lán)本。項(xiàng)目目錄結(jié)構(gòu)如下:

在manager.py文件中,定義了項(xiàng)目啟動(dòng)的入口函數(shù):

#確保服務(wù)器只會(huì)在該腳本被Python解釋器直接執(zhí)行的時(shí)候才會(huì)運(yùn)行,而不是作為模塊導(dǎo)入的時(shí)候。

if__name__==__main__:

#啟用cmd命令行

#manager.run()

app.run(host=,port=9000,debug=True)

同時(shí),在該文件中創(chuàng)建了工廠方法實(shí)例:

app=create_app()

在工程方法中,對(duì)數(shù)據(jù)庫(kù)進(jìn)行了相關(guān)配置,創(chuàng)建了前端導(dǎo)航欄,同時(shí)對(duì)所創(chuàng)建的藍(lán)本進(jìn)行了注冊(cè)。在創(chuàng)建的藍(lán)本中主要涉及授權(quán)、路由及錯(cuò)誤處理模塊。

#構(gòu)造工廠方法

defcreate_app():

#在這里__name__==__main__

app=Flask(__name__)

app.url_map.converters[regex]=RegexConverter

#防止跨站攻擊注:為了增強(qiáng)安全性,密鑰不應(yīng)直接寫入代碼,而應(yīng)該保存在環(huán)境變量中

#app.config[SECRET_KEY]=hardtoguessstringSUNNY2017

#app.secret_key=Sunny123456

#flask提供的讀取外部文件

app.config.from_pyfile(config)

#basedir=os.path.abspath(os.path.dirname(__file__))

#print(basedir)

#配置數(shù)據(jù)庫(kù)連接

app.config[SQLALCHEMY_DATABASE_URI]=MySQL+pymysql://lmapp:lmapp@localhost/smp

app.config[SQLALCHEMY_COMMIT_ON_TEARDOWN]=True

app.config[SQLALCHEMY_TRACK_MODIFICATIONS]=True

nav.register_element(top,Navbar(uAPP安盾,

View(u當(dāng)前在線,main.index),

View(u全部用戶,main.all_users),

View(u注銷,main.logout),

View(u修改密碼,main.chgpwd),

nav.init_app(app)

db.init_app(app)

bootstrap.init_app(app)

#init_views(app)

from.authim

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論