Python中的WSGI
Python中的WSGI
文章目錄
- Python中的WSGI
- 一、WSGI引入
- 1. 瀏覽器請求動態(tài)頁面過程
- 2.問題
- 二、什么是WSGI
- 三、WSGI的接口
- 1.WSGI接口定義格式
- 2.參數(shù)解釋
- 3.回調(diào)函數(shù)start_response解析
- 4.WSGI的作用
- 四、使用WSGI實現(xiàn)一個mini_frame(web框架)
一、WSGI引入
1. 瀏覽器請求動態(tài)頁面過程
2.問題
怎么在你剛建立的Web服務(wù)器上運行一個Django應(yīng)用和Flask應(yīng)用,如何不做任何改變而適應(yīng)不同的web架構(gòu)呢?
在以前,選擇 Python web 架構(gòu)會受制于可用的web服務(wù)器,反之亦然。如果架構(gòu)和服務(wù)器可以協(xié)同工作,那就好了:
但有可能面對(或者曾有過)下面的問題,當(dāng)要把一個服務(wù)器和一個架構(gòu)結(jié)合起來時,卻發(fā)現(xiàn)他們不是被設(shè)計成協(xié)同工作的:
那么,怎么可以不修改服務(wù)器和架構(gòu)代碼而確保可以在多個架構(gòu)下運行web服務(wù)器呢?答案就是 Python Web Server Gateway Interface (或簡稱 WSGI,讀作“wizgy”)。
WSGI允許開發(fā)者將選擇web框架和web服務(wù)器分開。可以混合匹配web服務(wù)器和web框架,選擇一個適合的配對。比如,可以在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上運行 Django, Flask, 或 Pyramid。真正的混合匹配,得益于WSGI同時支持服務(wù)器和架構(gòu):
web服務(wù)器必須具備WSGI接口,所有的現(xiàn)代Python Web框架都已具備WSGI接口,它讓你不對代碼作修改就能使服務(wù)器和特點的web框架協(xié)同工作。
WSGI由web服務(wù)器支持,而web框架允許你選擇適合自己的配對,但它同樣對于服務(wù)器和框架開發(fā)者提供便利使他們可以專注于自己偏愛的領(lǐng)域和專長而不至于相互牽制。其他語言也有類似接口:java有Servlet API,Ruby 有 Rack。
二、什么是WSGI
- (1)、RESTful只是設(shè)計風(fēng)格而不是標準,而WSGI(Web Server Gateway Interface,Web服務(wù)器網(wǎng)關(guān)接口)則是Python語言中所定義的Web服務(wù)器和Web應(yīng)用程序之間或框架之間的通用接口標準。
- (2)、WSGI就是一座橋梁,橋梁的一端稱為服務(wù)端或網(wǎng)關(guān)端,另一端稱為應(yīng)用端或者框架端,WSGI的作用就是在協(xié)議之間進行轉(zhuǎn)化。WSGI將Web組件分成了三類:Web 服務(wù)器(WSGI Server)、Web中間件(WSGI Middleware)與Web應(yīng)用程序(WSGI Application)。
- (3)、Web Server接收HTTP請求,封裝一系列環(huán)境變量,按照WSGI接口標準調(diào)用注冊的WSGI Application,最后將響應(yīng)返回給客戶端。
- (4)、Web應(yīng)用的本質(zhì):
1)、瀏覽器發(fā)送HTTP請求
2)、服務(wù)器接收到請求,生成HTML文檔
3)、服務(wù)器把HTML文檔作為HTTP響應(yīng)的Body發(fā)送給瀏覽器
4)、瀏覽器收到HTTP響應(yīng),從HTTP Body取出HTML文檔進行顯示
- 接受HTTP請求、解析HTTP請求、發(fā)送HTTP響應(yīng)都是重復(fù)的苦力活,如果我們自己來寫這些底層代碼,還沒開始寫HTML,先要花半把個月研讀HTTP規(guī)范。所以底層的代碼應(yīng)該由專門的服務(wù)器軟件實現(xiàn),我們用python專注于生成HTML文檔。
- 因為我們不想要接觸TCP連接、HTTP原始請求和響應(yīng)格式。所以需要一個統(tǒng)一的接口,專心用python編寫Web業(yè)務(wù)。
三、WSGI的接口
1.WSGI接口定義格式
WSGI接口定義非常簡單,它只要求Web開發(fā)者實現(xiàn)一個函數(shù),就可以響應(yīng)HTTP請求。我們來看一個最簡單的Web版本的“Hello World!”:
def application(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html')])return 'Hello World!'2.參數(shù)解釋
上面的application()函數(shù)就是符合WSGI標準的一個HTTP處理函數(shù),它接收兩個參數(shù):
- environ:一個包含所有HTTP請求信息的dict對象;在用戶向服務(wù)器請求數(shù)據(jù)時獲得
- start_response:一個發(fā)送HTTP響應(yīng)的函數(shù),就是一個回調(diào)函數(shù),用來生成服務(wù)器對瀏覽器的響應(yīng)頭部。
3.回調(diào)函數(shù)start_response解析
在application()函數(shù)中,調(diào)用:
start_response('200 OK', [('Content-Type', 'text/html')])start_response()函數(shù)接收兩個參數(shù):
- 一個是HTTP響應(yīng)碼
- ,一個是一組元組列表list表示的HTTP Header,每個Header用一個包含兩個str的tuple表示。
start_response的作用是限制響應(yīng)Body的內(nèi)容形式以及提供響應(yīng)的狀態(tài)碼信息===》Header,所以這個回調(diào)函數(shù)的作用就是發(fā)送HTTP響應(yīng)的Header
注意Header只能發(fā)送一次,也就是只能調(diào)用一次start_response()。
然后,把函數(shù)的返回值作為HTTP響應(yīng)的Body發(fā)送給瀏覽器。
4.WSGI的作用
整個application()函數(shù)本身沒有涉及到任何解析HTTP的部分,也就是說,把底層web服務(wù)器解析部分和應(yīng)用程序邏輯部分進行了分離,這樣開發(fā)者就可以專心做一個領(lǐng)域了
不過,等等,這個application()函數(shù)怎么調(diào)用?如果我們自己調(diào)用,兩個參數(shù)environ和start_response我們沒法提供,返回的str也沒法發(fā)給瀏覽器。
所以application()函數(shù)必須由WSGI服務(wù)器來調(diào)用。有很多符合WSGI規(guī)范的服務(wù)器。而我們此時的web服務(wù)器項目的目的就是做一個既能解析靜態(tài)網(wǎng)頁還可以解析動態(tài)網(wǎng)頁的服務(wù)器
四、使用WSGI實現(xiàn)一個mini_frame(web框架)
未完待續(xù)…!
總結(jié)
以上是生活随笔為你收集整理的Python中的WSGI的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下使用python操作mysq
- 下一篇: Redis数据操作和与Python交互