python中WSGI是什么,Python應(yīng)用WSGI詳解
為了讓大家更好的對python中WSGI有更好的理解,我們先從最簡單的認識WSGI著手,然后介紹一下WSGI幾個經(jīng)常使用到的接口,了解基本的用法和功能,最后,我們通過實例了解一下WSGI在實際項目中如何使用。
WSGI是什么?
wsgi是一個web組件的接口防范,wsgi將web組件分為三類:web服務(wù)器,web中間件,web應(yīng)用程序
wsgi基本處理模式為:wsgi Server -> wsgi middleware -> wsgi application
WSGI,全稱 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是為 Python 語言定義的 Web 服務(wù)器和 Web 應(yīng)用程序或框架之間的一種簡單而通用的接口。自從 WSGI 被開發(fā)出來以后,許多其它語言中也出現(xiàn)了類似接口。
WSGI 的官方定義是,the Python Web Server Gateway Interface。從名字就可以看出來,這東西是一個Gateway,也就是網(wǎng)關(guān)。網(wǎng)關(guān)的作用就是在協(xié)議之間進行轉(zhuǎn)換。
WSGI 是作為 Web 服務(wù)器與 Web 應(yīng)用程序或應(yīng)用框架之間的一種低級別的接口,以提升可移植 Web 應(yīng)用開發(fā)的共同點。WSGI 是基于現(xiàn)存的 CGI 標準而設(shè)計的。
很多框架都自帶了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。當(dāng)然性能都不好,自帶的 web server 更多的是測試用途,發(fā)布時則使用生產(chǎn)環(huán)境的 WSGI server或者是聯(lián)合 nginx 做 uwsgi 。
也就是說,WSGI就像是一座橋梁,一邊連著web服務(wù)器,另一邊連著用戶的應(yīng)用。但是呢,這個橋的功能很弱,有時候還需要別的橋來幫忙才能進行處理。
WSGI的作用
WSGI有兩方:“服務(wù)器”或“網(wǎng)關(guān)”一方,以及“應(yīng)用程序”或“應(yīng)用框架”一方。服務(wù)方調(diào)用應(yīng)用方,提供環(huán)境信息,以及一個回調(diào)函數(shù)(提供給應(yīng)用程序用來將消息頭傳遞給服務(wù)器方),并接收Web內(nèi)容作為返回值。
所謂的 WSGI中間件同時實現(xiàn)了API的兩方,因此可以在WSGI服務(wù)和WSGI應(yīng)用之間起調(diào)解作用:從WSGI服務(wù)器的角度來說,中間件扮演應(yīng)用程序,而從應(yīng)用程序的角度來說,中間件扮演服務(wù)器?!爸虚g件”組件可以執(zhí)行以下功能:
重寫環(huán)境變量后,根據(jù)目標URL,將請求消息路由到不同的應(yīng)用對象。
允許在一個進程中同時運行多個應(yīng)用程序或應(yīng)用框架。
負載均衡和遠程處理,通過在網(wǎng)絡(luò)上轉(zhuǎn)發(fā)請求和響應(yīng)消息。
進行內(nèi)容后處理,例如應(yīng)用XSLT樣式表。
wsgi server:
理解為一個符合wsgi規(guī)范的web server,接收request請求,封裝一系列環(huán)境變量,按照wsgi規(guī)范調(diào)用注冊的wsgi app,最后將response返回給客戶端。
工作流程:
1、服務(wù)器創(chuàng)建socket,監(jiān)聽port,等待client 連接
2、當(dāng)請求過來時,server解析client msg放到環(huán)境變量environ中,并調(diào)用綁定的handler來處理
3、handler解析這個http請求,將請求消息例如method、path等放到environ中
4、wsgi handler再將一些server端消息也放到environ中,最后server msg,client msg,以及本次請求msg 全部都保存到了環(huán)境變量envrion中;
5、wsgi handler調(diào)用注冊的wsgi app,并將envrion和回調(diào)函數(shù)傳給wsgi app
6、wsgi app將reponse header/status/body回傳給wsgi handler
7、handler 通過socket將response msg返回到client
WSGI Application
wsgi application就是一個普通的callable對象,當(dāng)有請求到來時,wsgi server會調(diào)用這個wsgi app。這個對象接收兩個參數(shù),通常為environ,start_response。environ就像前面介紹的,可以理解為環(huán)境變量,
跟一次請求相關(guān)的所有信息都保存在了這個環(huán)境變量中,包括服務(wù)器信息,客戶端信息,請求信息。start_response是一個callback函數(shù),wsgi application通過調(diào)用start_response,將response headers/status 返回給wsgi server。此外這個wsgi app會return 一個iterator對象 ,這個iterator就是response body。
Dispatcher Middleware,用來實現(xiàn)URL 路由:(代碼說明)
#!/usr/bin/python #encoding=utf-8 #利用wsgiref 作為wsgi server from wsgiref.simple_server import make_server """ def simple_app(environ, start_response): status = '200 ok' response_headers = [('Content-type', 'text/plain')] #設(shè)置http頭 start_response(status, response_headers) return [u"test wsgi app".encode('utf-8')] class AppClass(object): def __call__(self, environ, start_response): status = "200 ok" response_headers = [('Content-type', 'text/plain')] start_response(status, response_headers) return [u"class AppClass".encode('utf-8')] """ #wsgi app只要是一個callable對象即可,不一定要是函數(shù) #一個實現(xiàn)了__call__方法示例也ok的 #httpd = make_server('', 8080, simple_app) """ app = AppClass() httpd = make_server('', 8080, app) httpd.serve_forever() """ URL_PATTERNS = ( ('AA/', 'AA_app'), ('BB/', 'BB_app'), ) class Dispatcher(object): #實現(xiàn)路由功能: def _match(self, path): path = path.split('/')[1] for url, app in URL_PATTERNS: if path in url: return app def __call__(self, environ, start_response): path = environ.get('PATH_INFO', '/') app = self._match(path) if app: app = globals()[app] return app(environ, start_response) else: start_response("404 NOT FOUND",[('Content-type', 'text/plain')]) return ["page dose not exists"] def AA_app(environ, start_response): start_response("200 OK",[('Content-type', 'text/html')]) return ["AA page"] def BB_app(environ, start_response): start_response("200 OK",[('Content-type', 'text/html')]) return ["BB page"] app = Dispatcher() httpd = make_server('', 8090, app) httpd.serve_forever() 測試結(jié)果: server端: root@u163:~/cp163/python# python wsgi_app.py 192.168.2.162 - - [04/Nov/2015 18:44:06] "GET /AA HTTP/1.1" 200 7 192.168.2.162 - - [04/Nov/2015 18:44:22] "GET /BB HTTP/1.1" 200 7 client端: root@u162:~# curl http://192.168.2.163:8090/AA AA page root@u162:~# curl http://192.168.2.163:8090/BB BB page root@u162:~#
下面在給大家推薦一篇關(guān)機接口的詳細介紹文章:深入解析Python中的WSGI接口
相關(guān)文章
python 將數(shù)據(jù)保存為excel的xls格式(實例講解)
下面小編就為大家分享一篇python 將數(shù)據(jù)保存為excel的xls格式(實例講解),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05

VSCode運行或調(diào)試python文件無反應(yīng)的問題解決

詳解pandas中Series()和DataFrame()的區(qū)別與聯(lián)系

python中創(chuàng)建一個包并引用使用的操作方法

Python實現(xiàn)字符串的逆序 C++字符串逆序算法