国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

淺談flask源碼之請求過程

2020-02-15 22:32:27
字體:
來源:轉載
供稿:網友

Flask

Flask是什么?

Flask是一個使用 Python 編寫的輕量級 Web 應用框架, 讓我們可以使用Python語言快速搭建Web服務, Flask也被稱為 "microframework" ,因為它使用簡單的核心, 用 extension 增加其他功能

為什么選擇Flask?

我們先來看看python現在比較流行的web框架

Flask Django Tornado Sanic

Flask: 輕, 組件間松耦合, 自由、靈活,可擴展性強,第三方庫的選擇面廣的同時也增加了組件間兼容問題

Django: Django相當于一個全家桶, 幾乎包括了所有web開發用到的模塊(session管理、CSRF防偽造請求、Form表單處理、ORM數據庫對象化、模板語言), 但是相對應的會造成一個緊耦合的情況, 對第三方插件不太友好

Tornado: 底層通過eventloop來實現異步處理請求, 處理效率高, 學習難度大, 處理稍有不慎很容易阻塞主進程導致不能正常提供服務, 新版本也支持asyncio

Sanic: 一個類Flask框架, 但是底層使用uvloop進行異步處理, 可以使用同步的方式編寫異步代碼, 而且運行效率十分高效.

WSGI

先來看看維基百科對WSGI的定義

Web服務器網關接口(Python Web Server Gateway Interface,縮寫為WSGI)是為Python語言定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口.

何為網關, 即從客戶端發出的每個請求(數據包)第一個到達的地方, 然后再根據路由進行轉發處理. 而對于服務端發送過來的消息, 總是先通過網關層, 然后再轉發至客戶端

那么可想而知, WSGI其實是作為一個網關接口, 來接受Server傳遞過來的信息, 然后通過這個接口調用后臺app里的view function進行響應.

先看一段有趣的對話:

Nginx:Hey, WSGI, 我剛收到了一個請求,我需要你作些準備, 然后由Flask來處理這個請求.
WSGI:OK, Nginx. 我會設置好環境變量, 然后將這個請求傳遞給Flask處理.
Flask:Thanks. WSGI給我一些時間,我將會把請求的響應返回給你.
WSGI:Alright, 那我等你.
Flask:Okay, 我完成了, 這里是請求的響應結果, 請求把結果傳遞給Nginx.
WSGI:Good job! Nginx, 這里是響應結果, 已經按照要求給你傳遞回來了.
Nginx:Cool, 我收到了, 我把響應結果返回給客戶端.大家合作愉快~

對話里面可以清晰了解到WSGI、nginx、Flask三者的關系

下面來看看Flask中的wsgi接口(注意:每個進入Flask的請求都會調用Flask.__call__)

# 摘自Flask源碼 app.pyclass Flask(_PackageBoundObject):  # 中間省略  def __call__(self, environ, start_response):    return self.wsgi_app(environ, start_response)        def wsgi_app(self, environ, start_response):    # environ: 一個包含全部HTTP請求信息的字典, 由WSGI Server解包HTTP請求生成    # start_response: WSGI Server提供的函數, 調用可以發送響應的狀態碼和HTTP報文頭,    # 函數在返回前必須調用一次.    :param environ: A WSGI environment.    :param start_response: A callable accepting a status code,      a list of headers, and an optional exception context to      start the response.    # 創建上下文    ctx = self.request_context(environ)    error = None    try:      try:        # 把上下文壓棧        ctx.push()        # 分發請求        response = self.full_dispatch_request()      except Exception as e:        error = e        response = self.handle_exception(e)      except:        error = sys.exc_info()[1]        raise      # 返回結果      return response(environ, start_response)    finally:      if self.should_ignore_error(error):        error = None        # 上下文出棧        ctx.auto_pop(error)            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 化隆| 金乡县| 革吉县| 咸宁市| 阿拉善左旗| 长春市| 澄城县| 宜都市| 慈利县| 白水县| 塔城市| 贵港市| 井陉县| 泾川县| 谢通门县| 大兴区| 汶上县| 吴忠市| 乡城县| 郁南县| 青田县| 黄平县| 达拉特旗| 晋中市| 青阳县| 浮梁县| 革吉县| 昂仁县| 松桃| 金湖县| 丹江口市| 台江县| 隆安县| 资阳市| 津市市| 河南省| 大港区| 博客| 泰州市| 金坛市| 灵山县|