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

首頁 > 編程 > Python > 正文

python中WSGI是什么,Python應用WSGI詳解

2020-01-04 16:15:45
字體:
來源:轉載
供稿:網友

為了讓大家更好的對python中WSGI有更好的理解,我們先從最簡單的認識WSGI著手,然后介紹一下WSGI幾個經常使用到的接口,了解基本的用法和功能,最后,我們通過實例了解一下WSGI在實際項目中如何使用。

WSGI是什么?

wsgi是一個web組件的接口防范,wsgi將web組件分為三類:web服務器,web中間件,web應用程序

wsgi基本處理模式為:wsgi Server -> wsgi middleware -> wsgi application

WSGI,全稱 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是為 Python 語言定義的 Web 服務器和 Web 應用程序或框架之間的一種簡單而通用的接口。自從 WSGI 被開發出來以后,許多其它語言中也出現了類似接口。

WSGI 的官方定義是,the Python Web Server Gateway Interface。從名字就可以看出來,這東西是一個Gateway,也就是網關。網關的作用就是在協議之間進行轉換。

WSGI 是作為 Web 服務器與 Web 應用程序或應用框架之間的一種低級別的接口,以提升可移植 Web 應用開發的共同點。WSGI 是基于現存的 CGI 標準而設計的。

很多框架都自帶了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。當然性能都不好,自帶的 web server 更多的是測試用途,發布時則使用生產環境的 WSGI server或者是聯合 nginx 做 uwsgi 。

也就是說,WSGI就像是一座橋梁,一邊連著web服務器,另一邊連著用戶的應用。但是呢,這個橋的功能很弱,有時候還需要別的橋來幫忙才能進行處理。

WSGI的作用

WSGI有兩方:“服務器”或“網關”一方,以及“應用程序”或“應用框架”一方。服務方調用應用方,提供環境信息,以及一個回調函數(提供給應用程序用來將消息頭傳遞給服務器方),并接收Web內容作為返回值。

所謂的 WSGI中間件同時實現了API的兩方,因此可以在WSGI服務和WSGI應用之間起調解作用:從WSGI服務器的角度來說,中間件扮演應用程序,而從應用程序的角度來說,中間件扮演服務器。“中間件”組件可以執行以下功能:

重寫環境變量后,根據目標URL,將請求消息路由到不同的應用對象。

允許在一個進程中同時運行多個應用程序或應用框架。

負載均衡和遠程處理,通過在網絡上轉發請求和響應消息。

進行內容后處理,例如應用XSLT樣式表。

wsgi server:

理解為一個符合wsgi規范的web server,接收request請求,封裝一系列環境變量,按照wsgi規范調用注冊的wsgi app,最后將response返回給客戶端。

工作流程:

1、服務器創建socket,監聽port,等待client 連接

2、當請求過來時,server解析client msg放到環境變量environ中,并調用綁定的handler來處理

3、handler解析這個http請求,將請求消息例如method、path等放到environ中

4、wsgi handler再將一些server端消息也放到environ中,最后server msg,client msg,以及本次請求msg 全部都保存到了環境變量envrion中;

5、wsgi handler調用注冊的wsgi app,并將envrion和回調函數傳給wsgi app

6、wsgi app將reponse header/status/body回傳給wsgi handler

7、handler 通過socket將response msg返回到client

WSGI Application

wsgi application就是一個普通的callable對象,當有請求到來時,wsgi server會調用這個wsgi app。這個對象接收兩個參數,通常為environ,start_response。environ就像前面介紹的,可以理解為環境變量,

跟一次請求相關的所有信息都保存在了這個環境變量中,包括服務器信息,客戶端信息,請求信息。start_response是一個callback函數,wsgi application通過調用start_response,將response headers/status 返回給wsgi server。此外這個wsgi app會return 一個iterator對象 ,這個iterator就是response body。

Dispatcher Middleware,用來實現URL 路由:(代碼說明)

#!/usr/bin/python #encoding=utf-8#利用wsgiref 作為wsgi serverfrom wsgiref.simple_server import make_server"""def simple_app(environ, start_response):status = '200 ok'response_headers = [('Content-type', 'text/plain')] #設置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對象即可,不一定要是函數#一個實現了__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):#實現路由功能:def _match(self, path):path = path.split('/')[1]for url, app in URL_PATTERNS:if path in url:return appdef __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()測試結果: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 7192.168.2.162 - - [04/Nov/2015 18:44:22] "GET /BB HTTP/1.1" 200 7client端:root@u162:~# curl http://192.168.2.163:8090/AAAA pageroot@u162:~# curl http://192.168.2.163:8090/BBBB pageroot@u162:~#

 


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 清镇市| 六盘水市| 康定县| 岢岚县| 南郑县| 广饶县| 建瓯市| 漳浦县| 锡林浩特市| 抚州市| 嵊州市| 万宁市| 温宿县| 金塔县| 成都市| 乐山市| 高台县| 东乡族自治县| 光山县| 无棣县| 黄骅市| 虹口区| 崇信县| 车险| 阿拉善右旗| 高唐县| 新野县| 楚雄市| 涞源县| 山阴县| 阿尔山市| 瑞昌市| 汉阴县| 安康市| 团风县| 河间市| 获嘉县| 阿瓦提县| 平湖市| 平湖市| 阜新市|