欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中WSGI是什么,Python應(yīng)用WSGI詳解

 更新時(shí)間:2017年11月24日 10:25:23   投稿:laozhang  
這篇文章主要介紹一下python中的WSGI, 小編在網(wǎng)上找了幾篇非常好的關(guān)于WSGI介紹,整理一下分享給大家。

為了讓大家更好的對(duì)python中WSGI有更好的理解,我們先從最簡(jiǎn)單的認(rèn)識(shí)WSGI著手,然后介紹一下WSGI幾個(gè)經(jīng)常使用到的接口,了解基本的用法和功能,最后,我們通過(guò)實(shí)例了解一下WSGI在實(shí)際項(xiàng)目中如何使用。

WSGI是什么?

wsgi是一個(gè)web組件的接口防范,wsgi將web組件分為三類(lèi):web服務(wù)器,web中間件,web應(yīng)用程序

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

WSGI,全稱(chēng) Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是為 Python 語(yǔ)言定義的 Web 服務(wù)器和 Web 應(yīng)用程序或框架之間的一種簡(jiǎn)單而通用的接口。自從 WSGI 被開(kāi)發(fā)出來(lái)以后,許多其它語(yǔ)言中也出現(xiàn)了類(lèi)似接口。

WSGI 的官方定義是,the Python Web Server Gateway Interface。從名字就可以看出來(lái),這東西是一個(gè)Gateway,也就是網(wǎng)關(guān)。網(wǎng)關(guān)的作用就是在協(xié)議之間進(jìn)行轉(zhuǎn)換。

WSGI 是作為 Web 服務(wù)器與 Web 應(yīng)用程序或應(yīng)用框架之間的一種低級(jí)別的接口,以提升可移植 Web 應(yīng)用開(kāi)發(fā)的共同點(diǎn)。WSGI 是基于現(xiàn)存的 CGI 標(biāo)準(zhǔn)而設(shè)計(jì)的。

很多框架都自帶了 WSGI server ,比如 Flask,webpy,Django、CherryPy等等。當(dāng)然性能都不好,自帶的 web server 更多的是測(cè)試用途,發(fā)布時(shí)則使用生產(chǎn)環(huán)境的 WSGI server或者是聯(lián)合 nginx 做 uwsgi 。

也就是說(shuō),WSGI就像是一座橋梁,一邊連著web服務(wù)器,另一邊連著用戶的應(yīng)用。但是呢,這個(gè)橋的功能很弱,有時(shí)候還需要?jiǎng)e的橋來(lái)幫忙才能進(jìn)行處理。

WSGI的作用

WSGI有兩方:“服務(wù)器”或“網(wǎng)關(guān)”一方,以及“應(yīng)用程序”或“應(yīng)用框架”一方。服務(wù)方調(diào)用應(yīng)用方,提供環(huán)境信息,以及一個(gè)回調(diào)函數(shù)(提供給應(yīng)用程序用來(lái)將消息頭傳遞給服務(wù)器方),并接收Web內(nèi)容作為返回值。

所謂的 WSGI中間件同時(shí)實(shí)現(xiàn)了API的兩方,因此可以在WSGI服務(wù)和WSGI應(yīng)用之間起調(diào)解作用:從WSGI服務(wù)器的角度來(lái)說(shuō),中間件扮演應(yīng)用程序,而從應(yīng)用程序的角度來(lái)說(shuō),中間件扮演服務(wù)器?!爸虚g件”組件可以執(zhí)行以下功能:

重寫(xiě)環(huán)境變量后,根據(jù)目標(biāo)URL,將請(qǐng)求消息路由到不同的應(yīng)用對(duì)象。

允許在一個(gè)進(jìn)程中同時(shí)運(yùn)行多個(gè)應(yīng)用程序或應(yīng)用框架。

負(fù)載均衡和遠(yuǎn)程處理,通過(guò)在網(wǎng)絡(luò)上轉(zhuǎn)發(fā)請(qǐng)求和響應(yīng)消息。

進(jìn)行內(nèi)容后處理,例如應(yīng)用XSLT樣式表。

wsgi server:

理解為一個(gè)符合wsgi規(guī)范的web server,接收request請(qǐng)求,封裝一系列環(huán)境變量,按照wsgi規(guī)范調(diào)用注冊(cè)的wsgi app,最后將response返回給客戶端。

工作流程:

1、服務(wù)器創(chuàng)建socket,監(jiān)聽(tīng)port,等待client 連接

2、當(dāng)請(qǐng)求過(guò)來(lái)時(shí),server解析client msg放到環(huán)境變量environ中,并調(diào)用綁定的handler來(lái)處理

3、handler解析這個(gè)http請(qǐng)求,將請(qǐng)求消息例如method、path等放到environ中

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

5、wsgi handler調(diào)用注冊(cè)的wsgi app,并將envrion和回調(diào)函數(shù)傳給wsgi app

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

7、handler 通過(guò)socket將response msg返回到client

WSGI Application

wsgi application就是一個(gè)普通的callable對(duì)象,當(dāng)有請(qǐng)求到來(lái)時(shí),wsgi server會(huì)調(diào)用這個(gè)wsgi app。這個(gè)對(duì)象接收兩個(gè)參數(shù),通常為environ,start_response。environ就像前面介紹的,可以理解為環(huán)境變量,

跟一次請(qǐng)求相關(guān)的所有信息都保存在了這個(gè)環(huán)境變量中,包括服務(wù)器信息,客戶端信息,請(qǐng)求信息。start_response是一個(gè)callback函數(shù),wsgi application通過(guò)調(diào)用start_response,將response headers/status 返回給wsgi server。此外這個(gè)wsgi app會(huì)return 一個(gè)iterator對(duì)象 ,這個(gè)iterator就是response body。

Dispatcher Middleware,用來(lái)實(shí)現(xiàn)URL 路由:(代碼說(shuō)明)

#!/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只要是一個(gè)callable對(duì)象即可,不一定要是函數(shù)
#一個(gè)實(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):
#實(shí)現(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()

測(cè)試結(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)機(jī)接口的詳細(xì)介紹文章:深入解析Python中的WSGI接口

相關(guān)文章

  • python爬蟲(chóng)中的url下載器用法詳解

    python爬蟲(chóng)中的url下載器用法詳解

    在本篇內(nèi)容里小編給各位整理的是一篇關(guān)于python爬蟲(chóng)中的url下載器用法詳解內(nèi)容,需要的朋友們參考下。
    2020-11-11
  • Python反射操作對(duì)象屬性方法詳解

    Python反射操作對(duì)象屬性方法詳解

    這篇文章主要介紹了Python反射操作對(duì)象屬性方法詳解,在Python面對(duì)對(duì)象中,通過(guò)字符串的形式去操作對(duì)象的屬性方法就稱(chēng)之為反射(在Python中一切事物都是可以為對(duì)象),需要的朋友可以參考下
    2023-08-08
  • python 將數(shù)據(jù)保存為excel的xls格式(實(shí)例講解)

    python 將數(shù)據(jù)保存為excel的xls格式(實(shí)例講解)

    下面小編就為大家分享一篇python 將數(shù)據(jù)保存為excel的xls格式(實(shí)例講解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • python面向?qū)ο笾翟?lèi)的聲明周期詳解

    python面向?qū)ο笾翟?lèi)的聲明周期詳解

    這篇文章主要介紹python的元類(lèi)生命周期,我們可以和之前探討類(lèi)的生命中周期一樣,我們寫(xiě)一個(gè)案例,使用print來(lái)輸出一些信息,來(lái)判斷如果基于元類(lèi)而言,那么生命周期是怎么樣的,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-05-05
  • 一些Python?5行代碼的神奇操作匯總

    一些Python?5行代碼的神奇操作匯總

    最開(kāi)始學(xué)習(xí)?Python,不需要太過(guò)復(fù)雜,下面這篇文章主要給大家介紹了關(guān)于Python?5行代碼的神奇操作,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • VSCode運(yùn)行或調(diào)試python文件無(wú)反應(yīng)的問(wèn)題解決

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

    這篇文章主要給大家介紹了關(guān)于VSCode運(yùn)行或調(diào)試python文件無(wú)反應(yīng)的問(wèn)題解決,使用VScode編譯運(yùn)行C/C++沒(méi)有問(wèn)題,但是運(yùn)行Python的時(shí)候出了問(wèn)題,所以這里給大家總結(jié)下,需要的朋友可以參考下
    2023-07-07
  • 基于Pycharm加載多個(gè)項(xiàng)目過(guò)程圖解

    基于Pycharm加載多個(gè)項(xiàng)目過(guò)程圖解

    這篇文章主要介紹了基于Pycharm加載多個(gè)項(xiàng)目過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 詳解pandas中Series()和DataFrame()的區(qū)別與聯(lián)系

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

    本文主要介紹了詳解pandas中Series()和DataFrame()的區(qū)別與聯(lián)系,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • python中創(chuàng)建一個(gè)包并引用使用的操作方法

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

    python包在開(kāi)發(fā)中十分常見(jiàn),一般通過(guò)導(dǎo)入包含特定功能的python模塊包進(jìn)行使用。當(dāng)然,也可以自己創(chuàng)建打包模塊,然后發(fā)布,安裝使用,這篇文章主要介紹了python中如何創(chuàng)建一個(gè)包并引用使用,需要的朋友可以參考下
    2022-08-08
  • Python實(shí)現(xiàn)字符串的逆序 C++字符串逆序算法

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

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)字符串的逆序,C++將字符串逆序輸出,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04

最新評(píng)論