WSGI

1. 瀏覽器請求動態(tài)頁面過程

2. WSGI

怎么在你剛建立的Web服務(wù)器上運行一個Django應(yīng)用Flask應(yīng)用,如何不做任何改變而適應(yīng)不同的web架構(gòu)呢嚷闭?

在以前攒岛,選擇 Python web 架構(gòu)會受制于可用的web服務(wù)器,反之亦然胞锰。如果架構(gòu)和服務(wù)器可以協(xié)同工作灾锯,那就好了:

但有可能面對(或者曾有過)下面的問題,當要把一個服務(wù)器和一個架構(gòu)結(jié)合起來時嗅榕,卻發(fā)現(xiàn)他們不是被設(shè)計成協(xié)同工作的:

3.png

那么顺饮,怎么可以不修改服務(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骆捧。

3.定義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!'

上面的application()函數(shù)就是符合WSGI標準的一個HTTP處理函數(shù)妆绞,它接收兩個參數(shù):

  • environ:一個包含所有HTTP請求信息的dict對象;
  • start_response:一個發(fā)送HTTP響應(yīng)的函數(shù)枫攀。

整個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ù)器

4. web服務(wù)器-----WSGI協(xié)議---->web框架 傳遞的字典

{
    'HTTP_ACCEPT_LANGUAGE': 'zh-cn',
    'wsgi.file_wrapper': <built-infunctionuwsgi_sendfile>,
    'HTTP_UPGRADE_INSECURE_REQUESTS': '1',
    'uwsgi.version': b'2.0.15',
    'REMOTE_ADDR': '172.16.7.1',
    'wsgi.errors': <_io.TextIOWrappername=2mode='w'encoding='UTF-8'>,
    'wsgi.version': (1,0),
    'REMOTE_PORT': '40432',
    'REQUEST_URI': '/',
    'SERVER_PORT': '8000',
    'wsgi.multithread': False,
    'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'HTTP_HOST': '172.16.7.152: 8000',
    'wsgi.run_once': False,
    'wsgi.input': <uwsgi._Inputobjectat0x7f7faecdc9c0>,
    'SERVER_PROTOCOL': 'HTTP/1.1',
    'REQUEST_METHOD': 'GET',
    'HTTP_ACCEPT_ENCODING': 'gzip,deflate',
    'HTTP_CONNECTION': 'keep-alive',
    'uwsgi.node': b'ubuntu',
    'HTTP_DNT': '1',
    'UWSGI_ROUTER': 'http',
    'SCRIPT_NAME': '',
    'wsgi.multiprocess': False,
    'QUERY_STRING': '',
    'PATH_INFO': '/index.html',
    'wsgi.url_scheme': 'http',
    'HTTP_USER_AGENT': 'Mozilla/5.0(Macintosh;IntelMacOSX10_12_5)AppleWebKit/603.2.4(KHTML,likeGecko)Version/10.1.1Safari/603.2.4',
    'SERVER_NAME': 'ubuntu'
}

應(yīng)用程序示例


import time

def application(environ, start_response):
    status = '200 OK'
    response_headers = [('Content-Type', 'text/html')]
    start_response(status, response_headers)
    return str(environ) + '==Hello world from a simple WSGI application!--->%s\n' % time.ctime()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颗味,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牺弹,更是在濱河造成了極大的恐慌浦马,老刑警劉巖时呀,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晶默,居然都是意外死亡谨娜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門磺陡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趴梢,“玉大人,你說我怎么就攤上這事币他∥氚校” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵蝴悉,是天一觀的道長彰阴。 經(jīng)常有香客問我,道長拍冠,這世上最難降的妖魔是什么尿这? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮庆杜,結(jié)果婚禮上妻味,老公的妹妹穿的比我還像新娘。我一直安慰自己欣福,他們只是感情好责球,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拓劝,像睡著了一般雏逾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郑临,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天栖博,我揣著相機與錄音,去河邊找鬼厢洞。 笑死仇让,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的躺翻。 我是一名探鬼主播丧叽,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼公你!你這毒婦竟也來了踊淳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤陕靠,失蹤者是張志新(化名)和其女友劉穎迂尝,沒想到半個月后脱茉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡垄开,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年琴许,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溉躲。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡虚吟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出签财,到底是詐尸還是另有隱情串慰,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布唱蒸,位于F島的核電站邦鲫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏神汹。R本人自食惡果不足惜庆捺,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屁魏。 院中可真熱鬧滔以,春花似錦、人聲如沸氓拼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桃漾。三九已至坏匪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撬统,已是汗流浹背适滓。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恋追,地道東北人凭迹。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像苦囱,于是被迫代替她去往敵國和親嗅绸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容