摘要:教你如何使用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用一個包含兩個str
的tuple
表示觉渴,這里('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
運行:
然后打開瀏覽器厦取,輸入http://localhost:8888/
,就可以看到編寫的內(nèi)容:
同時管搪,在命令提示符中虾攻,可以看到wsgiref打印的log信息:
我們稍微改造一下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!
:
小結(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吧( ̄▽ ̄)~*