flask應(yīng)用啟動

參考文檔:https://blog.csdn.net/sinat_36651044/article/details/77532510

20170824095810092.png

再完整一些的流程:
(1)命令行中python flaskapp.py 運行,flaskapp.py模塊糜值,逐行運行flaskapp.py中的代碼丰捷。
(2) app = Flask(name)實例化一個Flask 對象坯墨,name為當前模塊名。

(3) @app.route("/") 使用了裝飾器病往,和add_url_rule性質(zhì)一樣捣染。功能是添加endpoint( ‘/’)和view_func(’index’)的映射關(guān)系到view_functions字典中。

(4) if name == 'main': 保證當前模塊是被直接運行停巷,而不是被其他模塊導入耍攘,然后在運行之后的代碼。

(5) app.run(debug=True) 在本地服務(wù)器上運行flask 應(yīng)用畔勤,同時傳遞了debug=True參數(shù)蕾各。

(6) run(self, host=None, port=None, debug=None, **options),self就是實例化了的 app庆揪,運行run()之后式曲,會設(shè)置host = '127.0.0.1', port = 5000。

(7)run()方法中 run_simple(host, port, self, **options) 運行之后會創(chuàng)建一個本地服務(wù)器缸榛。

(8) 設(shè)置默認的_got_first_request = False吝羞,表明服務(wù)器還沒有收到客戶端的請求。

(9) run_simple()100多行内颗,那些提示消息(*Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) 等)也是在run_simple()中設(shè)置的钧排。重要的是這么一句srv = make_server(...),在這兒創(chuàng)建了本地服務(wù)器均澳。

(10) 根據(jù)前面?zhèn)鬟f的參數(shù)恨溜,make_server(...)返回了一個單進程單線程的WSGI server,即BaseWSGIServer负懦。BaseWSGIServer繼承了HTTPServer筒捺;HTTPServer繼承了TCPServer柏腻;TCPServer繼承了BaseServer纸厉。不考慮細節(jié),就是創(chuàng)建了本地服務(wù)器五嫂,同時颗品,本地服務(wù)器已經(jīng)記錄了flaskapp信息。

(11) WSGI server的功能:監(jiān)聽指定的端口沃缘,收到 HTTP 請求的時候解析為 WSGI 格式躯枢,然后調(diào)用 app 去執(zhí)行處理的邏輯。

再看從客戶端輸入網(wǎng)址槐臀,到看到網(wǎng)頁響應(yīng)的過程:

(1) 客戶端發(fā)送請求到 WSGI server锄蹂,WSGI server使用call 方法來調(diào)用 app處理請求,call方法返回了wsgi_app(environ, start_response)水慨,即使用wsgi_app(self, environ, start_response) 處理請求并將處理結(jié)果返回到服務(wù)器得糜,再返回到客戶端敬扛。

(2) 從BaseWSGIServer中的定義開始看:
BaseWSGIServer中有行代碼是handler = WSGIRequestHandler,即收到客戶端的請求后朝抖,本地的 WSGI server使用WSGIRequestHandler來處理請求啥箭。

(3) WSGIRequestHandler 有個重要的方法是make_environ(self),返回一個environ字典治宣〖苯模可以創(chuàng)建一個供app 運行的環(huán)境。

(4) 然后看WSGIRequestHandler 中的 handle_one_request()方法侮邀。handle_one_request()中關(guān)鍵的run_wsgi()坏怪,看名字,運行wsgi豌拙。

(5) WSGIRequestHandler繼承自BaseHTTPRequestHandler陕悬;BaseHTTPRequestHandler繼承自StreamRequestHandler;StreamRequestHandler繼承自BaseRequestHandler按傅。

(6) 看wsgi內(nèi)部的第一個 if語句捉超,如果請求頭中'Expect'''中間有'100-continue',將'HTTP/1.1 100 Continue\r\n\r\n'寫入到wfile中唯绍。

  • headers is an instance of email.message.Message (or a derived class) containing the header information;
  • wfile is a file object open for writing.
    (7) 不看中間的函數(shù)定義拼岳,到了最重要的一行execute(self.server.app),(創(chuàng)建WSGI server時將app作為參數(shù)傳遞并保存在了WSGI server中)這里調(diào)用app來處理客戶端請求况芒。

(8) WSGI中調(diào)用app 會使用到Flask中的call方法惜纸。

(9) 不看具體處理過程,WSGI server現(xiàn)在完成了接收用戶請求绝骚,調(diào)用flask 應(yīng)用來處理請求的過程耐版。

然后開始了真正處理一個請求的過程。

(1) 回到Flask類中看call方法:
call(self, environ, start_response) 压汪,這里的self 是flask應(yīng)用本身粪牲,即實例化的app,environ, start_response 由WSGI server 提供止剖。call最后會返回wsgi_app(environ, start_response)腺阳,即使用wsgi_app 來處理客戶端的請求。

(2) wsgi_app 中:
ctx = self.request_context(environ)首先將environ 封裝在了一個請求上下文變量ctx中穿香。請求上下文使用棧結(jié)構(gòu)存儲數(shù)據(jù)亭引,ctx.push() 將environ 壓棧放在棧頂。

(3) 關(guān)鍵的一行response = self.full_dispatch_request() 使用 full_dispatch_request() 處理請求皮获,隨后返回處理結(jié)果:return response(environ, start_response)焙蚓。

(4)full_dispatch_request() :

Dispatches the request and on top of that performs request pre and postprocessing as well as HTTP exception catching and error handling.
首先是self.try_trigger_before_first_request_functions()
init函數(shù)中設(shè)置了self._got_first_request = False,try_trigger_before_first_request_functions()的最后一行設(shè)置了self._got_first_request = True,表明要開始處理請求了购公。

不分析太多了赵哲,full_dispatch_request() 關(guān)鍵是調(diào)用dispatch_request() 做真實處理,最后返回finalize_request() 將處理結(jié)果變成真正的響應(yīng)君丁。

(5) dispatch_request():

Does the request dispatching. Matches the URL and returns the return value of the view or error handler. This does not have to be a response object. In order to convert the return value to aproper response object, call :func: make_response .
① req = _request_ctx_stack.top.request 將請求上下文棧頂?shù)恼埱筚x值給req枫夺,(req 會包含請求的詳細信息)
②rule = req.url_rule 將req 中的url_rule (’/’)賦值給rule,(請求和flaskapp中代碼一致)
③ 在運行@app.route("/") 時將endpoint( ‘/’)和view_func(’index’)的映射關(guān)系到了view_functions字典中绘闷。
④如果在flaskapp 代碼中找不到輸入的 URL橡庞,會返回 404 錯誤。
⑤如果輸入的URL在flaskapp 代碼有相應(yīng)的 URL印蔗,會返回 flaskapp 對應(yīng)的視圖函數(shù)扒最。
⑥上面說的是完整的URL-Viewfunc映射關(guān)系,flaskapp 以及 WSGI server 中使用的是endpoint(‘/’, ‘/index’, ‘/about’) -Viewfunc 的映射關(guān)系华嘹。
⑦總結(jié)來說吧趣,dispatch_request()判斷用戶輸入的URL在flask應(yīng)用中有沒有相關(guān)的定義。如果有耙厚,將對應(yīng)的視圖函數(shù)的內(nèi)容返回到full_dispatch_request: rv = self.preprocess_request()强挫。

(6) full_dispatch_request最后會調(diào)用finalize_request(rv) 方法將返回結(jié)果轉(zhuǎn)換成一個真正的響應(yīng)。

(7) finalize_request(rv) 代碼不復雜薛躬,主要就是使用response = self.make_response(rv) 將處理結(jié)果變成一個真正的響應(yīng)(視圖函數(shù)中字符串變成html形式)俯渤,最后return response,這個響應(yīng)會返回到full_dispatch_request型宝,然后返回到wsgi_app八匠。

(8) 以上wsgi_app 完成了一個請求處理的過程,最后return response(environ, start_response) 將處理結(jié)果返回給 WSGI server趴酣,WSGI server再返回給客戶端(瀏覽器)梨树,瀏覽器中顯示了2017-08-21,即flaskapp中index視圖函數(shù)的返回值岖寞。


作者:sinat_36651044
來源:CSDN
原文:https://blog.csdn.net/sinat_36651044/article/details/77532510
版權(quán)聲明:本文為博主原創(chuàng)文章抡四,轉(zhuǎn)載請附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慎璧,一起剝皮案震驚了整個濱河市床嫌,隨后出現(xiàn)的幾起案子跨释,更是在濱河造成了極大的恐慌胸私,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳖谈,死亡現(xiàn)場離奇詭異岁疼,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門捷绒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑰排,“玉大人,你說我怎么就攤上這事暖侨⊥肿。” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵字逗,是天一觀的道長京郑。 經(jīng)常有香客問我,道長葫掉,這世上最難降的妖魔是什么些举? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮俭厚,結(jié)果婚禮上户魏,老公的妹妹穿的比我還像新娘。我一直安慰自己挪挤,他們只是感情好叼丑,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扛门,像睡著了一般幢码。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尖飞,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天症副,我揣著相機與錄音,去河邊找鬼政基。 笑死贞铣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的沮明。 我是一名探鬼主播辕坝,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荐健!你這毒婦竟也來了酱畅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤江场,失蹤者是張志新(化名)和其女友劉穎纺酸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體址否,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡餐蔬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片樊诺。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡仗考,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出词爬,到底是詐尸還是另有隱情秃嗜,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布顿膨,位于F島的核電站痪寻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虽惭。R本人自食惡果不足惜橡类,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芽唇。 院中可真熱鬧顾画,春花似錦、人聲如沸匆笤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炮捧。三九已至庶诡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咆课,已是汗流浹背末誓。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留书蚪,地道東北人喇澡。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像殊校,于是被迫代替她去往敵國和親晴玖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

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