產品經理也能讀懂的技術:什麼是WSGI

Python之禪發表於2018-12-11

640?wx_fmt=jpeg
題圖:Photo by Clay Banks on Unsplash


嘗試用最淺顯的方式來說明什麼是WSGI,據說產品妹子都讀懂了。

一個完整的 Web 應用包含兩部分,一個是伺服器程式(Server),一個是應用程式(Application),伺服器程式負責接收瀏覽器傳送過來的請求,應用程式負責處理具體的業務邏輯。 比如我基於 Django 框架開發一個部落格應用,部署在生產環境時會用 Gunicorn 或者 Uwsgi 作為伺服器程式。

Python 中 Web 框架非常多,Flask、Django、Bottle、Pyramid、Tornado 等等,甚至你也自己也可以造一個 Web 框架,那麼這麼多框架,為什麼他們都可以用 Gunicorn 或者 Uwsgi 來部署呢?

答案就是 WSGI 規範。

WSGI 不是框架,也不是一個模組,而是介於 Web應用程式(Web框架)與 Web Server 之間互動的一種規範。只要大家都遵循WSGI規範實現 Web 框架,就可以 使用 Gunicorn 來執行,規範最早在 PEP333 中被提出。

640?wx_fmt=jpeg

WSGI 規定了Web伺服器(Server)和應用程式(Application)雙方各自需要實現什麼介面,以便兩者能完美的配合使用,這個和 USB Type-C 規範很像, 只要手機和充電線都遵循了 Type-C 介面規範, 大家的充電線就可以複用,不同的是充電誰快誰慢的問題,而蘋果沒有遵循Type-C規範,所以只有他自家的線才能充蘋果手機。

現在你應該差不多理解什麼是WSGI了,那麼 WSGI 對應用程式是如何規範的呢? 很簡單,你只需要寫一個符合以下格式的函式即可:

def app(environ, start_response):
   start_response("200 OK", [("Content-Type","text/html")])
   return ["Hello world!\n"]

這個函式必須接收兩個引數,environ 是一個類似字典的資料結構,封裝了瀏覽器的請求資料。 start_response 是一個函式,必須在app 裡面呼叫,引數就是狀態碼和響應內容的型別。app 的返回值就是請求的響應資料。 最終 app 是被 server 來呼叫的。

現在我們用 Python 內建的 http server 來啟動這個程式


from wsgiref.simple_server import make_server

if __name__ == "__main__":
   httpd = make_server("", 8000, app)
   print("Serving http on port 8000")
   httpd.serve_forever()

啟動,訪問地址:

640?wx_fmt=png

你理解了嗎?點個贊吧。

對了,明天有個贈書活動,不要錯過了哦。


推薦閱讀

640?
優秀如你都在關注

相關文章