WSGI /與/ uWSGI
在阿里雲上部署項目時,在通信中我們都會用到wsgi與uWSGI,這此我就帶大家來了解一下wsgi與uWSGI。
對了,上次有個朋友問我Django的生命周期是什么?我在下一篇博客中給大家講解一下。
WSGI
WSGI是Web Server Gateway Interface的縮寫。他是PythonWeb服務器網關接口,
是Python應用程序或框架和Web服務器之間的一種接口,已經被廣泛接受,
它已基本達成它的可移植性方面的目標。
其實我覺得他更像一個協議,他可以運行在任何服務器上WSGI應用(Application)都可以在任何服務器(Server)上運行, 反之亦然。
CLIENT:客戶端 SERVER:服務器 APPLICATION:應用器

(圖片有些模糊,可以放大看)
從這副圖中我們可以看出,應用他必須是一個可調用對象,也可以是一個函數,
也可以是一個可以實現__call__()的方法,每收到一個請求,APPLICATION(應用器)會調用應用。
應用在處理完這些數據,准備返回數據的時候,先調用服務傳給它的函數,最后再返回可迭代對象作為數據。
在上圖中,黃色到綠色之間有一個environ,他包括了請求的相關信息,
比如請求方式、請求路徑等等,start_response是應用處理完畢后,需要調用的函數,
用於告訴服務設置響應的頭部信息或錯誤處理等等,他必須是一個字典,
如::{請求信息:’***’,請求方式:’****’,請求路徑:’****’}。
我們先定義一個可調用的函數,它可以使用服務器傳給它的請求相關的內容 environ,

然后是服務器:可以在項目文件中找到wsgi_server.py

uWSGI ,uWSGI全稱(Web Server Gateway Interface)
python安裝uWSGI : : https://www.runoob.com/python3/python-uwsgi.html
uWSGI也是一個web服務器,它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的作用是與uWSGI服務器進行交換。
他不是一個框架,一個軟件,或者是API,而只是一種規范描述web server如何與web application通信的規范。
WSGI協議主要包括server和application兩部分
===========================
底層內容:有興趣可以了解一下,沒有興趣勿看
WSGI server負責從客戶端接收請求,將request轉發給application,將application返回的response返回給客戶端;
WSGI application接收由server轉發的request,處理請求,並將處理結果返回給server。
application中可以包括多個棧式的中間件(middlewares),這些中間件需要同時實現server與application,
因此可以在WSGI服務器與WSGI應用之間起調節作用,
對服務器來說,中間件扮演應用程序,對應用程序來說,中間件扮演服務器。
uWSGI使用通用的API和通用的配置風格來實現應用服務器 (對於各種編程語言和協議),代理,進程管理器和監控器。
核心 :》 (實現配置、進程管理、socket創建、監控、日志記錄、共享內存塊、ipc、集群成員和 uWSGI訂閱服務器)
請求插件:》 (為各種語言和平台實現應用服務器接口:WSGI, PSGI, Rack, Lua WSAPI, CGI, PHP, Go ...)
網關:》 (實現負載均衡器、代理和路由器)
Emperor :》(實現大量實例管理和監控)
循環引擎 :》(實現事件和並發,組件可以在reforking, threaded, asynchronous/evented和green thread/coroutine模式下運行。支持多種技術,
包括uGreen, Greenlet, Stackless, Gevent, Coro::AnyEvent, Tornado, Goroutines和Fibers)

django WSGI application :django項目中可以找到
WSGI application應該實現為一個可調用對象,例如函數、方法、類(包含`call`方法)。需要接收兩個參數:
- 一個字典,該字典可以包含了客戶端請求的信息以及其他信息,
可以認為是請求上下文,一般叫做environment(編碼中多簡寫為environ、env)
- 一個用於發送HTTP響應狀態(HTTP status )、響應頭(HTTP headers)的回調函數
通過回調函數將響應狀態和響應頭返回給server,同時返回響應正文(response body),
響應正文是可迭代的、並包含了多個字符串。
下面是Django中application的具體實現部分:

可以看出application的流程包括:
1,加載所有中間件,以及執行框架相關的操作,設置當前線程腳本前綴,發送請求開始信號;
2,處理請求,調用get_response()方法處理當前請求,該方法的的主要邏輯是通過urlconf找到對應的view和callback,
按順序執行各種middleware和callback。
3,調用由server傳入的start_response()方法將響應header與status返回給server。
4,返回響應正文
下面表示WSGI server服務器處理流程中關鍵的類和方法。

