成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

Python學習之解析Flask運行原理(圖文詳解)

本篇文章給大家帶來了關于python的相關知識,其中主要介紹了Flask的運行原理相關問題,對Flask的運行原理做一簡要解析,以增強對Flask的了解,希望對大家有幫助。

Python學習之解析Flask運行原理(圖文詳解)

推薦學習:python學習教程

??所有的 Python Web框架都要遵循 WSGI 協議,在這里還是要簡單回顧一下 WSGI 的核心概念。

??WSGI 中有一個非常重要的概念:每個Python Web應用都是一個可調用(callable)的對象。在 flask 中,這個對象就是 app = Flask(name) 創建出來的 app,就是下圖中的綠色Application部分。要運行web應用,必須有 web server,比如我們熟悉的apache、nginx,或者python中的gunicorn,我們下面要講到的werkzeug提供的WSGIServer,它們是下圖的黃色Server部分。
Python學習之解析Flask運行原理(圖文詳解)
??Server和Application之間怎么通信,就是WSGI的功能。它規定了 app(environ, start_response) 的接口,server會調用 application,并傳給它兩個參數:environ 包含了請求的所有信息,start_response 是 application 處理完之后需要調用的函數,參數是狀態碼、響應頭部還有錯誤信息。

??WSGI application 非常重要的特點是:它是可以嵌套的。換句話說,可以寫個application,它做的事情就是調用另外一個 application,然后再返回(類似一個 proxy)。一般來說,嵌套的最后一層是業務應用,中間就是 middleware。這樣的好處是,可以解耦業務邏輯和其他功能,比如限流、認證、序列化等都實現成不同的中間層,不同的中間層和業務邏輯是不相關的,可以獨立維護;而且用戶也可以動態地組合不同的中間層來滿足不同的需求。
Python學習之解析Flask運行原理(圖文詳解)
??Flask基于Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask使用BSD授權。 Flask也被稱為“microframework”,因為它使用簡單的核心,用extension增加其他功能。Flask沒有默認使用的數據庫、窗體驗證工具。然而,Flask保留了擴增的彈性,可以用Flask-extension加入這些功能:ORM、窗體驗證工具、文件上傳、各種開放式身份驗證技術。我們可以這么理解,Flask是一個核心,而其他功能則是一些插件,需要什么功能,只要找到對應的插件,將其插入核心就能夠實現該功能了。

??Flask是怎么將代碼轉換為我們可見的Web網頁的。首先,我們得先從Web程序的一般流程來看,對于我們的Web應用來說,當客戶端想要獲取動態資源 時,(比如ASP和PHP這類語言寫的網站),這個時候就會發起一個HTTP請求(比如用瀏覽器訪問一個URL),此時Web應用程序就會在服務器后臺進行相應的業務處理(比如對數據庫進行操作或是進行一些計算操作等),取出用戶需要的數據,生成相應的HTTP響應(當然,如果訪問的是 靜態資源 ,服務器則會直接返回用戶所需的資源,不會進行業務處理)。整個處理工程如下所示:
Python學習之解析Flask運行原理(圖文詳解)
??在實際的應用中,不同的請求可能會調用相同的處理邏輯。這里有著相同業務處理邏輯的HTTP請求可以用一類URL來標識。比如在我們的博客站點中,對于所有想要獲取Articles內容的請求而言,可以用 articles/這類URL來表示,這里的article_id用以區分不同的article。接著在后臺定義一個get_article(article_id)的函數,用來獲取article相應的數據,此外還需要建立URL和函數之間的一一對應關系。這就是Web開發中所謂的路由分發 ,如下圖所示:
Python學習之解析Flask運行原理(圖文詳解)
??在Flask中,使用werkzeug來做路由分發,werkzeug是Flask使用的底層WSGI庫(WSGI,全稱 Web Server Gateway interface,或者 Python Web Server Gateway Interface,是為 Python 語言定義的Web服務器和Web應用程序之間的一種簡單而通用的接口)。
??WSGI將Web服務分成兩個部分:服務器和應用程序。WGSI服務器只負責與網絡相關的兩件事:接收瀏覽器的HTTP請求、向瀏覽器發送HTTP應答;而對HTTP請求的具體處理邏輯,則通過調用WSGI應用程序進行。WSGI工作流程如下圖所示:
Python學習之解析Flask運行原理(圖文詳解)
??在Flask中,路由分發的代碼寫起來十分簡單,如下:

# 管理員注銷頁面 @main.route('/logout') def logout():     dm = DataManager()     currentUsers = dm.getUsers('0')     print(currentUsers[0])     return render_template('currentUsers.html', users=currentUsers)

??通過業務邏輯函數獲得我們所需的數據后,服務器將會根據這些數據來生成HTTP響應(對于Web應用來說,一般就是一個HTML文件,這個是可以直接被我們的客戶端,即瀏覽器直接讀取并解釋的)。在Web開發中,常規的做法是將獲取的數據傳入Web應用提供的一個HTML模板文件中,經過模板系統的渲染后最終得到我們所需要的HTML響應文件。
??一般情況下,雖然請求不同,但是響應中的數據的展示方式是相同的 ,通俗點說就是除了我們請求獲得的數據不一樣外,其他都是一樣的,那么我們就可以設計一個模板(除了數據內容可以改動,其他都是固定的HTML文件)。我們以博客站點為例,對不同article而言,其具體article content雖然不同,但頁面展示的內容除了請求的數據外都是一樣的,都有標題攔,內容欄等。也就是說,對于article來說,我們只需提供一個HTML模板,然后傳入不同article數據,即可得到不同的HTTP響應。這就是所謂的模板渲染 ,如下圖所示:
Python學習之解析Flask運行原理(圖文詳解)
??在Flask中使用Jinja2模板渲染引擎來做模板渲染(Jinja2是基于python的模板引擎,功能比較類似于于PHP的smarty,J2ee的Freemarker和velocity。它能完全支持unicode,并具有集成的沙箱執行環境,應用廣泛。jinja2使用BSD授權)。Jinja2的工作流程如下圖所示:
Python學習之解析Flask運行原理(圖文詳解)
??在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運行原理做一簡要解析。在實例項目中,使用到了程序工廠函數和藍本。項目目錄結構如下:
Python學習之解析Flask運行原理(圖文詳解)
??在manager.py文件中,定義了項目啟動的入口函數:

# 確保服務器只會在該腳本被 Python 解釋器直接執行的時候才會運行,而不是作為模塊導入的時候。 if __name__ == '__main__':     # 啟用cmd命令行     # manager.run()     app.run(host='0.0.0.0', port=9000, debug=True)

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

	app = create_app()

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

# 構造工廠方法 def create_app():     # 在這里__name__ == __main__     app = Flask(__name__)     app.url_map.converters['regex'] = RegexConverter     # 防止跨站攻擊 注:為了增強安全性,密鑰不應直接寫入代碼,而應該保存在環境變量中     # app.config['SECRET_KEY'] = 'hard to guess string SUNNY2017'     # 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(u'APP安盾',                                        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 .auth import auth as auth_blueprint     from .main import main as main_blueprint     # 注冊藍本 url_prefix='/auth'     app.register_blueprint(auth_blueprint,)     app.register_blueprint(main_blueprint, static_folder='static')     return app

推薦學習:python教程

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
亚洲AV永久无码3D动漫在线观| 色婷婷狠狠久久综合五月| 欧美整片欧洲熟妇色视频| 人妻无码熟妇乱又伦精品| 色哟哟网站在线观看| 无码福利日韩神码福利片| 亚洲VA无码手机在线电影| 夜夜躁婷婷AV蜜桃妖精视频| 自拍偷自拍亚洲精品播放| MACBOOKPRO免费观看| 成人区人妻精品一区二区网站 | 无人区码一码二码三码四码| 亚洲AV成人无码网站大全唐人| 亚洲欲色欲WWW怡红院| 99久久精品国产第一页| 国产99久久精品一区二区| 国内精品久久久久久久999| 久久夜色撩人精品国产 | 部长的夫人的味道HD| 国产精品亚洲一区二区无码 | 夜夜高潮夜夜爽夜夜爱爱一区| AV中文字幕潮喷人妻系列| 国产成人精品无码专区| 九九精品无码专区免费| 欧美极品少妇XXXXⅩ| 我朋友的妻子2018| 一本一本久久A久久综合精品| 波多野结衣放荡的护士| 韩国三级日本三级美三级| 欧美 狠狠操 888| 我和亲妺在浴室作爱H伦| 一本加勒比波多野结衣高清| 成年女人毛片免费视频喷潮| 狠狠做五月深爱婷婷天天综合| 欧美成人伊人久久综合网| 午夜亚洲国产理论片中文飘花| 中文字幕AV无码免费久久| 国产SUV精品一区二区88L| 久久久久亚洲AV无码专区网站| 日本熟老太日本老熟网站| 亚洲精品无码久久久久去Q| YSL千人千色T9T9T90| 国产在线精品二区| 欧美 国产 综合 欧美 视频| 亚洲AⅤ永久无码精品AA| 99久久久国产精品免费| 国产强奷糟蹋漂亮邻居在线观看| 免费人成视网站在线不卡| 我和闺蜜在KTV被八人伦| 中文字幕在线观看| 国产午夜成人精品视频APP| 女生会把隐私透露给异性朋友| 性VODAFONEWIFI另类| 99亚偷拍自图区亚洲| 黑人大战日本人妻嗷嗷叫| 人妻丰满AV无码久久不卡| 亚洲人成色77777在线观看大 | 精品无码一区二区三区在线| 揉着我的奶从后面进去| 怡红院AV一区二区三区| 国产精品久久这里只有精品| 女生裙子里面到底穿了啥| 亚洲А∨天堂久久精品9966| 厨房里的激战2免费观看不打丐赛| 久久理伦片琪琪电影院| 无码不卡一区二区三区在线观看| A级精品国产片在线观看| 精品久久久久久久免费人妻| 少妇高潮太爽了在线播放| 18禁黄网站禁片免费观看香港| 国内精品国产成人国产三级| 日本猛少妇色XXXXX猛叫小说| 影音先锋男人资源站| 国产亚洲无日韩乱码| 日韩精品免费无码专区| 曰韩无码无遮挡A级毛片| 国产日韩一区在线精品| 日韩AV无码成人精品国产| 中国大陆女RAPPER欢迎你| 激情偷乱人伦小说视频| 屠户家的小娇花哒哒啦爱你| А√天堂 地址 在线| 老女人性饥渴XXXXⅩHD| 亚洲顶级裸体AV片| 国产精品-区区久久久狼| 日本XXXX裸体XXXX| 91人妻人人澡人人爽人人精品| 久久国国产免费999| 亚洲AV成人一区国产精品| 国产DB624色谱柱88690| 欧美最猛性XXXXX免费| 在线天堂8高清版在线观看| 娇妻出轨哀求高潮喷水| 无码人妻一区二区三区免费视频 | 亚洲一区强奸视频| 国产亚洲美女精品久久久2020| 少妇私密会所按摩到高潮呻吟| YY111111少妇影院| 妺妺窝人体色WWW在线韩国| 亚洲熟妇色XXXXX亚洲| 和人妻隔着帘子按摩中字| 无码专区6080YY免费视频| 国产Ⅴ亚洲V天堂A无码| 日韩Av无码一区二区| WWW.好好日.COM| 欧美VA亚洲VA在线观看| 中文字幕一区二区三区日韩精品| 久久久久无码精品国产| 亚洲熟妇无码乱子AⅤ电影| 加勒比久久综合久久鬼色88 | 无码国产玉足脚交久久2020| 丰满少妇被猛烈进入| 日文文本乱码高清| 成人欧美一区二区三区视频| 人妻人人澡人人添人人爽人人玩 | AV日日碰狠狠躁久久躁| 免费拗女网站1300部| 中文字幕日本乱码仑区在线| 毛片无码免费无码播放| 中文在线А√在线| 免费人成在线观看网站| 中文字幕在线亚洲日韩6页 | 中文字幕人妻无码专区APP| 蜜桃Av噜噜一区二区三区绯色| 在糖心VLOG唐伯虎女主角是谁| 久久天天躁狠狠躁夜夜爽| 一本大道在线无码一区| 老司机久久99久久精品播放免费| 一本一道波多野结衣一区| 久久天天躁夜夜躁狠狠躁2014| 一出一进一爽一粗一大视频免费的| 久久久久久国产精品美女| 一本久道久久综合狠狠老| 久久综合无码中文字幕无码TS| 中国帅气体育生GARY网站| 免费一对一真人视频| CAOPOREN超碰最新地址| 人妻丝袜中文无码AV影音先锋专| 超碰CAO已满18进入离开| 少妇被猛烈进入到喷白浆| 国产成人无码AA精品一区| 无人区一码卡二卡三乱码| 国产在线精品一区二区| 亚洲精品有码在线观看| 久久亚洲中文字幕精品有坂深雪| 18亚洲AV无码成人网站国产| 人妻的渴望波多野结衣| 公交车上荫蒂添的好舒服的句子| 我偷偷跟亲妺作爱H| 黑料不打烊隐藏入口GITHUB| 亚洲熟悉妇女XXX妇女AV| 免费韩国漫画网站观看| ZOOM与人性ZOOM2区别| 色先锋AV资源中文字幕| 国产日产欧产精品精品软件| 亚洲欧美日韩国产成人精品影院| 老熟妇乱子伦牲交视频| YY111111少妇影院理论片| 少妇BBW搡BBBB搡| 国产自无码视频在线观看| 亚洲一区二区三区乱码AⅤ蜜桃| 妺妺自愿做我的性玩具| 成人午夜爽爽爽免费视频| 午夜三级A三级三点自慰| 久久狠狠高潮亚洲精品| 9丨精品妻人一区二区三区蜜桃| 少妇被粗大猛进进出Va| 极品尤物被啪到呻吟喷水| 中文字幕日韩精品无码内射| 日韩论理论片在线观看| 国产在线看片无码不卡| 永久免费无码AV在线网站| 人人妻人人爽人人澡人人少妇| 国产精品视频一区二区三区无码 | 丁香婷婷在线成人播放视频| 香蕉久久一区二区不卡无毒影院| 精品无码久久久久久久久| 精品国产AV色欲果冻传媒| JEALOUSVUE成熟| 中国内射XXXX6981少妇| 国产婷婷色综合AV蜜臀AV| 中国人熟女HDFREEHDXⅩ| 日韩视频中文字幕精品偷拍| 豪妇荡乳1一5潘金莲2在线| 中文字幕人妻高清乱码| 天天看片天天AV免费观看| 久久久99久久久国产自输拍| 锕锕锕锕锕锕锕好疼JK漫画| 亚洲AV熟女高潮30P| 男阳茎进女阳道啪啪| 国产激情久久久久影院小草 | 亚洲A∨国产AV综合AV麻豆丫| 麻豆文化传媒精品一区观看| 国产AV无码专区亚洲AV软件| 野外做受又硬又粗又大视频√ | 欧美成A高清在线观看| 国产乱人伦AV麻豆网| 2019理论韩国理论中文| 香蕉久久AV一区二区三区APP| 女人扒开屁股桶爽6O分钟|