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

NO IMAGE

為了讓大家更好的對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 server
from 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 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()
測試結果:
server端:
[email protected]:~/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端:
[email protected]:~# curl http://192.168.2.163:8090/AA
AA page
[email protected]:~# curl http://192.168.2.163:8090/BB
BB page
[email protected]:~#

下面在給大家推薦一篇關機介面的詳細介紹文章:深入解析Python中的WSGI介面

您可能感興趣的文章:

解決python3中自定義wsgi函式,make_server函式報錯的問題使用Nginx uWsgi實現Python的Django框架站點動靜分離在Linux系統上通過uWSGI配置Nginx Python環境的教程在Mac OS上使用mod_wsgi連線Python與Apache伺服器詳解使用Nginx和uWSGI配置Python的web專案的方法深入解析Python中的WSGI介面在Windows伺服器下用Apache和mod_wsgi配置Python應用的教程利用Python指令碼在Nginx和uwsgi上部署MoinMoin的教程詳解Python程式與伺服器連線的WSGI介面在Debian下配置Python Django Nginx uWSGI MySQL的教程