【Python入門】47.Web開發(fā)之 WSGI接口

摘要:教你如何使用WSGI函數(shù)編寫一個簡單的Web應(yīng)用。


*寫在前面:為了更好的學(xué)習(xí)python极颓,博主記錄下自己的學(xué)習(xí)路程朱盐。本學(xué)習(xí)筆記基于廖雪峰的Python教程,如有侵權(quán)菠隆,請告知刪除兵琳。歡迎與博主一起學(xué)習(xí)Pythonヽ( ̄▽ ̄)? *


目錄

Web開發(fā)
使用WSGI接口
運行WSGI服務(wù)
小結(jié)

Web開發(fā)

使用WSGI接口

我們了解了HTTP協(xié)議和HTML之后,就能夠明白Web應(yīng)用的本質(zhì):

1.瀏覽器給服務(wù)器發(fā)送HTTP請求骇径;
2.服務(wù)器接收請求躯肌,并生成相應(yīng)的HTML文檔;
3.服務(wù)器給瀏覽器發(fā)送HTTP響應(yīng)破衔,里面包含HTML文檔羡榴;
4.瀏覽器收到響應(yīng),解析HTML文檔并展現(xiàn)給用戶运敢。

我們使用Python進(jìn)行Web開發(fā),就是要編寫這一過程忠售。

但是如果每一個Web應(yīng)用都要我們來編寫接收HTTP請求传惠,解析HTTP請求等底層工作,效率就大大降低稻扬。

我們希望通過Python專注于HTML文檔的編寫卦方,而把其他關(guān)于HTTP連接的編寫交給專門的服務(wù)器軟件來完成。

WSGI接口就能實現(xiàn)我們的目的泰佳。WSGI是Web Server Gateway Interface的簡稱盼砍,通過WSGI接口,我們只要編寫函數(shù)就能響應(yīng)HTTP的請求逝她。

我們來看一個簡單的例子:

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'<h1>Hello, web!</h1>']

函數(shù)application()是符合WSGI標(biāo)準(zhǔn)的一個HTTP處理函數(shù)浇坐。它接收兩個參數(shù):

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

函數(shù)start_response()需要接收兩個參數(shù):

第一個參數(shù)是HTTP響應(yīng)碼近刘,這里200 OK表示請求成功。
第二個參數(shù)是用list表示的HTTP Header臀晃,每個Header用一個包含兩個strtuple表示觉渴,這里('Content-Type', 'text/html')響應(yīng)類型是文本類型。

返回值b'<h1>Hello, web!</h1>'作為HTTP響應(yīng)的正文發(fā)給瀏覽器徽惋。

可見案淋,通過application()函數(shù),我們只需要考慮如何響應(yīng)請求险绘,而不需要考慮如何解析HTTP請求等內(nèi)容踢京。

運行WSGI服務(wù)

要調(diào)用application()函數(shù)誉碴,必須通過WSGI服務(wù)器。在Python中內(nèi)置了一個WSGI服務(wù)器——wsgiref漱挚。

我們先編寫一個簡單的WSGI處理函數(shù)翔烁,命名為wsgi_hello.py

# wsgi_hello.py

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'<h1>Hello, world!</h1>']

然后編寫一個wsgi_server.py,來用啟動WSGI服務(wù)器和加載處理函數(shù):

#wsgi_server.py

from wsgiref.simple_server import make_server   # 引入wsgiref模塊中的make_server函數(shù)
from wsgi_hello import application              # 引入application函數(shù)

httpd = make_server('', 8888, application)      # 創(chuàng)建一個服務(wù)器
print('Serving HTTP on port 8888..')
httpd.serve_forever()                          # 開始監(jiān)聽HTTP請求

函數(shù)make_server()用于創(chuàng)建服務(wù)器旨涝,傳入三個參數(shù)蹬屹,依次為IP地址、端口白华、處理函數(shù)慨默。

這里需要注意兩個文件放在同一目錄下,且端口8888沒有被占用弧腥。

在命令提示符中輸入wsgi_server.py運行:

WSGI1.png

然后打開瀏覽器厦取,輸入http://localhost:8888/,就可以看到編寫的內(nèi)容:

WSGI2.png

同時管搪,在命令提示符中虾攻,可以看到wsgiref打印的log信息:


WSGI3.png

我們稍微改造一下application()函數(shù),從environ里讀取PATH_INFO更鲁,就可以顯示動態(tài)信息:

# wsgi_hello.py

def application(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    body = '<h1>Hello, %s!</h1>' % (environ['PATH_INFO'][1:] or 'web')
    return [body.encode('utf-8')]

在地址欄中輸入用戶名作為URL的一部分霎箍,將返回Hello, xxx!

WSGI4.png

小結(jié)

無論多么復(fù)雜的Web應(yīng)用程序,入口都是一個WSGI處理函數(shù)澡为。HTTP請求的所有輸入信息都可以通過environ獲得漂坏,HTTP響應(yīng)的輸出都可以通過start_response()加上函數(shù)返回值作為Body。

如果要編寫復(fù)雜的Web應(yīng)用媒至,只使用WSGI函數(shù)來處理還是太麻煩了顶别。所以下一節(jié)中我們將介紹Web框架,進(jìn)一步簡化Web開發(fā)拒啰。


以上就是本節(jié)的全部內(nèi)容驯绎,感謝你的閱讀。

下一節(jié)內(nèi)容:Web開發(fā)之 Web框架

有任何問題與想法图呢,歡迎評論與吐槽条篷。

和博主一起學(xué)習(xí)Python吧( ̄▽ ̄)~*

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛤织,隨后出現(xiàn)的幾起案子赴叹,更是在濱河造成了極大的恐慌,老刑警劉巖指蚜,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乞巧,死亡現(xiàn)場離奇詭異,居然都是意外死亡摊鸡,警方通過查閱死者的電腦和手機绽媒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蚕冬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人是辕,你說我怎么就攤上這事囤热。” “怎么了获三?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵旁蔼,是天一觀的道長。 經(jīng)常有香客問我疙教,道長棺聊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任贞谓,我火速辦了婚禮限佩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裸弦。我一直安慰自己祟同,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布理疙。 她就那樣靜靜地躺著耐亏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沪斟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天暇矫,我揣著相機與錄音主之,去河邊找鬼。 笑死李根,一個胖子當(dāng)著我的面吹牛槽奕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播房轿,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粤攒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了囱持?” 一聲冷哼從身側(cè)響起夯接,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纷妆,沒想到半個月后盔几,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡掩幢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年逊拍,在試婚紗的時候發(fā)現(xiàn)自己被綠了上鞠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡芯丧,死狀恐怖芍阎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缨恒,我是刑警寧澤谴咸,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站肿轨,受9級特大地震影響寿冕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椒袍,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一驼唱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驹暑,春花似錦玫恳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帆焕,卻和暖如春惭婿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叶雹。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工财饥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人折晦。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓钥星,卻偏偏與公主長得像,于是被迫代替她去往敵國和親满着。 傳聞我的和親對象是個殘疾皇子谦炒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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