成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Flask基本工作流程

IT那活兒 / 1480人閱讀
Flask基本工作流程

點(diǎn)擊上方“IT那活兒”,關(guān)注后了解更多精彩內(nèi)容!!

什么是WSGI

這里先需要說一個(gè)概念,什么是WSGI。
WSGI 的官方定義是,the Python Web Server Gateway Interface。從名字就可以看出來(lái),這東西是一個(gè)Gateway,也就是網(wǎng)關(guān)。網(wǎng)關(guān)的作用就是在協(xié)議之間進(jìn)行轉(zhuǎn)換。
WSGI 是作為 Web 服務(wù)器與 Web 應(yīng)用程序或應(yīng)用框架之間的一種低級(jí)別的接口,以提升可移植 Web 應(yīng)用開發(fā)的共同點(diǎn)。WSGI 是基于現(xiàn)存的 CGI 標(biāo)準(zhǔn)而設(shè)計(jì)的。
很多框架都自帶了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。當(dāng)然性能都不好,自帶的 web server 更多的是測(cè)試用途,發(fā)布時(shí)則使用生產(chǎn)環(huán)境的 WSGI server或者是聯(lián)合 nginx 做 uwsgi 。

 WSGI具體的功能

上面講到了WSGI可以起到一個(gè)接口的功能,前面對(duì)接服務(wù)器,后面對(duì)接app的具體功能。
我們先來(lái)看看最簡(jiǎn)單的一個(gè)wsgi_app的實(shí)現(xiàn):
def application(environ, start_response):
#一個(gè)符合wsgi協(xié)議的應(yīng)用程序應(yīng)該接受2個(gè)參數(shù)  :
start_response(200 OK, [(Content-Type, text/html)])
#environ為http的相關(guān)信息;
 return [b

Hello, world!

]
#return出來(lái)是響應(yīng)內(nèi)容。
但是,作為app本身,你就算啟動(dòng)了程序,你也沒辦法給application傳遞參數(shù)。
所以,實(shí)際上,調(diào)用application和傳遞2個(gè)參數(shù)的動(dòng)作,是服務(wù)器來(lái)進(jìn)行的,比如Gunicorn。
而這個(gè)叫做application的東西,在Flask框架內(nèi)部的名字,叫做wsgi_app。

Flask和WSGI

我們?cè)賮?lái)看下生成flask應(yīng)用的操作寫法:
from flask import Flask 
app = Flask(__name__) #生成app實(shí)例

@app.route(/index)

def index():  
return Hello World
這樣,一個(gè)flask app就生成了。
當(dāng)你的gunicorn收到http請(qǐng)求,去調(diào)用app的時(shí)候,他實(shí)際上是用了Flask 的 __call__方法。因此__call__方法怎么寫,決定了你整個(gè)流程從哪里開始。
那我們來(lái)看下Flask類的__call__方法的源碼:
class Flask(_PackageBoundObject): #Flask類 

   ...

 def __call__(self, environ, start_response): #Flask實(shí)例的__call__方法

return self.wsgi_app(environ, start_response) #
注意他的return,他返回的時(shí)候,實(shí)際上是調(diào)用了wsgi_app這個(gè)函數(shù)。
我們便知道,當(dāng)http請(qǐng)求從server發(fā)送過來(lái)的時(shí)候,他會(huì)啟動(dòng)__call__功能,最終實(shí)際是調(diào)用了wsgi_app功能并傳入environ和start_response。

WSGI_APP的內(nèi)部流程

第一步:生成request請(qǐng)求對(duì)象和請(qǐng)求上下文環(huán)境:
首先,你會(huì)看到ctx = self.request_context(environ)的語(yǔ)句,這個(gè)涉及到Flask使用了請(qǐng)求上下文和應(yīng)用上下文的概念,結(jié)構(gòu)為棧結(jié)構(gòu)。
第二步:請(qǐng)求進(jìn)入預(yù)處理,錯(cuò)誤處理及請(qǐng)求轉(zhuǎn)發(fā)到響應(yīng)的過程:
進(jìn)入wsgi_app的函數(shù)內(nèi)部,生成了request對(duì)象和上下文環(huán)境之后,進(jìn)入到try...except。
response = self.full_dispatch_request()
我們看到,響應(yīng)被賦值成了full_dispatch_request()方法的返回內(nèi)容,所以我們來(lái)看一下full_dispatch_request方法。
class Flask(_PackageBoundObject): 

 def full_dispatch_request(self):
   self.try_trigger_before_first_request_functions() #進(jìn)行發(fā)生真實(shí)請(qǐng)求前的處理

   try:  

     request_started.send(self) #socket部分的操作

     rv = self.preprocess_request() #進(jìn)行請(qǐng)求的預(yù)處理

     if rv is None:  

       rv = self.dispatch_request()

   except Exception as e:  

     rv = self.handle_user_exception(e)

   response = self.make_response(rv)

   response = self.process_response(response)

   request_finished.send(self, response=response)

   return response
他首先會(huì)觸發(fā) try_trigger_before_first_request_function()方法, 在方法內(nèi)部 會(huì)觸發(fā) _got_first_request 屬性,這個(gè)屬性的返回值是True或者False,True的話就代表了程序開始處理請(qǐng)求了。
第三步:返回到wsgi_app內(nèi)部
流程走回到了wsgi_app的內(nèi)部。
下面這段是wsgi_app內(nèi)部的代碼:
try: 

 try:

   response = self.full_dispatch_request()

 except Exception as e:

   error = e

   response = self.make_response(self.handle_exception(e))

 return response(environ, start_response)

finally:

 if self.should_ignore_error(error):

   error = None

 ctx.auto_pop(error)
當(dāng)response從剛剛的full_dispatch_request功能返回之后,函數(shù)會(huì)對(duì)這個(gè)response加上environ, start_response的參數(shù)并返回給Gunicorn。
至此,一個(gè)HTTP從請(qǐng)求到響應(yīng)的流程就完畢了。

本 文 原 創(chuàng) 來(lái) 源:IT那活兒微信公眾號(hào)(上海新炬王翦團(tuán)隊(duì))


文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/129703.html

相關(guān)文章

  • Flask Web Development —— 基本應(yīng)用程序結(jié)構(gòu)(下)

    摘要:有兩類應(yīng)用級(jí)和請(qǐng)求級(jí)。一個(gè)響應(yīng)中非常重要的部分是狀態(tài)碼,默認(rèn)設(shè)置來(lái)指示請(qǐng)求已經(jīng)成功處理。重定向通常由響應(yīng)狀態(tài)碼注明并且重定向的由頭部的給出。因?yàn)檫@些變化,應(yīng)用程序獲得一組基本的命令行選項(xiàng)。運(yùn)行顯示可用信息在應(yīng)用程序上下文的內(nèi)部運(yùn)行一個(gè)。 5、請(qǐng)求-響應(yīng)循環(huán) 現(xiàn)在你已經(jīng)玩過一個(gè)基本的Flask應(yīng)用程序,你也許想要知道更多關(guān)于Flask如何施展魔力。下面章節(jié)描述了一些框架設(shè)計(jì)方面的特點(diǎn)。...

    caohaoyu 評(píng)論0 收藏0
  • flask源碼走讀

    摘要:另外,如果你對(duì)模板渲染部分的內(nèi)容感興趣,也可以考慮閱讀文檔文檔文檔源碼閱讀,可以參考下面的函數(shù)打斷點(diǎn),再測(cè)試一個(gè)請(qǐng)求,理清過程。 Flask-Origin 源碼版本 一直想好好理一下flask的實(shí)現(xiàn),這個(gè)項(xiàng)目有Flask 0.1版本源碼并加了注解,挺清晰明了的,我在其基礎(chǔ)上完成了對(duì)Werkzeug的理解部分,大家如果想深入學(xué)習(xí)的話,可以參考werkzeug_flow.md. 閱讀前 為...

    Coly 評(píng)論0 收藏0
  • python大佬養(yǎng)成計(jì)劃----Flask藍(lán)圖

    摘要:使用藍(lán)圖的概念來(lái)制作應(yīng)用程序組件和支持應(yīng)用程序內(nèi)部或跨應(yīng)用程序的通用模式。藍(lán)圖可以大大簡(jiǎn)化大型應(yīng)用程序的工作方式,并為擴(kuò)展提供了在應(yīng)用程序上注冊(cè)操作的中心手段。相反,它是如何構(gòu)造或擴(kuò)展應(yīng)用程序的藍(lán)圖。 藍(lán)圖 之前我們已經(jīng)通過代碼了解了一些Flask基本的用法,現(xiàn)在出現(xiàn)一個(gè)問題,我們要做的功能越來(lái)越多,路由是不是都要放在run文件中呢?例如我們?cè)诓煌奈募级x了一些路由,如果想要訪問他...

    tianyu 評(píng)論0 收藏0
  • 使用Visual Studio Code編寫調(diào)試Python Flask程序

    摘要:最近由于工作關(guān)系,開始寫程序,同事有用的,有用的。第一種適合及以上版本,因?yàn)樵诎姹酒穑霈F(xiàn)了文件,配置可以寫成用文件啟動(dòng)程序,實(shí)測(cè)可以觸發(fā)斷點(diǎn)。 最近由于工作關(guān)系,開始寫flask web程序,同事有用Vim的,有用PyCharm的。在調(diào)研了一通python的編輯器,IDE之后,發(fā)現(xiàn)Visual Studio Code相對(duì)比較適合我。 VSC有相對(duì)較全的功能,比較好看舒服的主題,良好的...

    gotham 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<