Python學習之解析Flask運行原理(圖文詳解)_第1頁
Python學習之解析Flask運行原理(圖文詳解)_第2頁
Python學習之解析Flask運行原理(圖文詳解)_第3頁
Python學習之解析Flask運行原理(圖文詳解)_第4頁
Python學習之解析Flask運行原理(圖文詳解)_第5頁
已閱讀5頁,還剩1頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

Server和Application之間怎么通信,就是WSGI的功能。它規定了app(environ,start_response)的接口,server會調用application,并傳給它兩個參數:environ包含了請求的所有信息,start_response是application處理完之后需要調用的函數,參數是狀態碼、響應頭部還有錯誤信息。

WSGIapplication非常重要的特點是:它是可以嵌套的。換句話說,可以寫個application,它做的事情就是調用另外一個application,然后再返回(類似一個proxy)。一般來說,嵌套的最后一層是業務應用,中間就是middleware。這樣的好處是,可以解耦業務邏輯和其他功能,比如限流、認證、序列化等都實現成不同的中間層,不同的中間層和業務邏輯是不相關的,可以獨立維護;而且用戶也可以動態地組合不同的中間層來滿足不同的需求。

Flask基于WerkzeugWSGI工具箱和Jinja2模板引擎。Flask使用BSD授權。Flask也被稱為microframework,因為它使用簡單的核心,用extension增加其他功能。Flask沒有默認使用的數據庫、窗體驗證工具。然而,Flask保留了擴增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗證工具、文件上傳、各種開放式身份驗證技術。我們可以這么理解,Flask是一個核心,而其他功能則是一些插件,需要什么功能,只要找到對應的插件,將其插入核心就能夠實現該功能了。

Flask是怎么將代碼轉換為我們可見的Web網頁的。首先,我們得先從Web程序的一般流程來看,對于我們的Web應用來說,當客戶端想要獲取動態資源時,(比如ASP和PHP這類語言寫的網站),這個時候就會發起一個HTTP請求(比如用瀏覽器訪問一個URL),此時Web應用程序就會在服務器后臺進行相應的業務處理(比如對數據庫進行操作或是進行一些計算操作等),取出用戶需要的數據,生成相應的HTTP響應(當然,如果訪問的是靜態資源,服務器則會直接返回用戶所需的資源,不會進行業務處理)。整個處理工程如下所示:

在實際的應用中,不同的請求可能會調用相同的處理邏輯。這里有著相同業務處理邏輯的HTTP請求可以用一類URL來標識。比如在我們的博客站點中,對于所有想要獲取Articles內容的請求而言,可以用articles/這類URL來表示,這里的article_id用以區分不同的article。接著在后臺定義一個get_article(article_id)的函數,用來獲取article相應的數據,此外還需要建立URL和函數之間的一一對應關系。這就是Web開發中所謂的路由分發,如下圖所示:

在Flask中,使用werkzeug來做路由分發,werkzeug是Flask使用的底層WSGI庫(WSGI,全稱WebServerGatewayinterface,或者PythonWebServerGatewayInterface,是為Python語言定義的Web服務器和Web應用程序之間的一種簡單而通用的接口)。

WSGI將Web服務分成兩個部分:服務器和應用程序。WGSI服務器只負責與網絡相關的兩件事:接收瀏覽器的HTTP請求、向瀏覽器發送HTTP應答;而對HTTP請求的具體處理邏輯,則通過調用WSGI應用程序進行。WSGI工作流程如下圖所示:

在Flask中,路由分發的代碼寫起來十分簡單,如下:

#管理員注銷頁面

@mAIn.route(/logout)

deflogout():

dm=DataManager()

currentUsers=dm.getUsers(0)

print(currentUsers[0])

returnrender_template(currentUsers.html,users=currentUsers)

通過業務邏輯函數獲得我們所需的數據后,服務器將會根據這些數據來生成HTTP響應(對于Web應用來說,一般就是一個HTML文件,這個是可以直接被我們的客戶端,即瀏覽器直接讀取并解釋的)。在Web開發中,常規的做法是將獲取的數據傳入Web應用提供的一個HTML模板文件中,經過模板系統的渲染后最終得到我們所需要的HTML響應文件。

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

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

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

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

defget_article(article_id):

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

在Flask中,我們處理一個請求的流程就是,首先根據用戶提交的URL來決定由哪個業務邏輯函數來處理,然后在函數中進行操作,取得所需的數據。再將取得的數據傳給相應的模板文件中,由Jinja2負責渲染得到HTTP響應內容,即HTTP響應的HTML文件,然后由Flask返回響應內容。

下面主要以實例項目對Flask運行原理做一簡要解析。在實例項目中,使用到了程序工廠函數和藍本。項目目錄結構如下:

在manager.py文件中,定義了項目啟動的入口函數:

#確保服務器只會在該腳本被Python解釋器直接執行的時候才會運行,而不是作為模塊導入的時候。

if__name__==__main__:

#啟用cmd命令行

#manager.run()

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

同時,在該文件中創建了工廠方法實例:

app=create_app()

在工程方法中,對數據庫進行了相關配置,創建了前端導航欄,同時對所創建的藍本進行了注冊。在創建的藍本中主要涉及授權、路由及錯誤處理模塊。

#構造工廠方法

defcreate_app():

#在這里__name__==__main__

app=Flask(__name__)

app.url_map.converters[regex]=RegexConverter

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

#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)

#配置數據庫連接

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當前在線,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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論