【Python入門】47.Web開發之 WSGI介面
摘要:教你如何使用WSGI函式編寫一個簡單的Web應用。
*寫在前面:為了更好的學習python,博主記錄下自己的學習路程。本學習筆記基於廖雪峰的Python教程,如有侵權,請告知刪除。歡迎與博主一起學習Pythonヽ( ̄▽ ̄)ノ *
Web開發
使用WSGI介面
我們瞭解了HTTP協議和HTML之後,就能夠明白Web應用的本質:
1.瀏覽器給伺服器傳送HTTP請求; 2.伺服器接收請求,並生成相應的HTML文件; 3.伺服器給瀏覽器傳送HTTP響應,裡面包含HTML文件; 4.瀏覽器收到響應,解析HTML文件並展現給使用者。
我們使用Python進行Web開發,就是要編寫這一過程。
但是如果每一個Web應用都要我們來編寫接收HTTP請求,解析HTTP請求等底層工作,效率就大大降低。
我們希望通過Python專注於HTML文件的編寫,而把其他關於HTTP連線的編寫交給專門的伺服器軟體來完成。
WSGI介面就能實現我們的目的。WSGI是Web Server Gateway Interface的簡稱,通過WSGI介面,我們只要編寫函式就能響應HTTP的請求。
我們來看一個簡單的例子:
def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b'<h1>Hello, web!</h1>']
函式application()
是符合WSGI標準的一個HTTP處理函式。它接收兩個引數:
environ
:指包含所有HTTP請求資訊的dict
物件;
start_response
:傳送HTTP響應的函式。
函式start_response()
需要接收兩個引數:
第一個引數是HTTP響應碼,這裡200 OK
表示請求成功。
第二個引數是用list表示的HTTP Header,每個Header用一個包含兩個str
的tuple
表示,這裡('Content-Type', 'text/html')
響應型別是文字型別。
返回值b'<h1>Hello, web!</h1>'
作為HTTP響應的正文發給瀏覽器。
可見,通過application()
函式,我們只需要考慮如何響應請求,而不需要考慮如何解析HTTP請求等內容。
執行WSGI服務
要呼叫application()
函式,必須通過WSGI伺服器。在Python中內建了一個WSGI伺服器——wsgiref。
我們先編寫一個簡單的WSGI處理函式,命名為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伺服器和載入處理函式:
#wsgi_server.py
from wsgiref.simple_server import make_server # 引入wsgiref模組中的make_server函式
from wsgi_hello import application # 引入application函式
httpd = make_server('', 8888, application) # 建立一個伺服器
print('Serving HTTP on port 8888..')
httpd.serve_forever() # 開始監聽HTTP請求
函式make_server()
用於建立伺服器,傳入三個引數,依次為IP地址、埠、處理函式。
這裡需要注意兩個檔案放在同一目錄下,且埠8888沒有被佔用。
在命令提示符中輸入wsgi_server.py
執行:
然後開啟瀏覽器,輸入http://localhost:8888/
,就可以看到編寫的內容:
同時,在命令提示符中,可以看到wsgiref列印的log資訊:
我們稍微改造一下application()
函式,從environ
裡讀取PATH_INFO
,就可以顯示動態資訊:
# 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!
:
小結
無論多麼複雜的Web應用程式,入口都是一個WSGI處理函式。HTTP請求的所有輸入資訊都可以通過environ獲得,HTTP響應的輸出都可以通過start_response()加上函式返回值作為Body。
如果要編寫複雜的Web應用,只使用WSGI函式來處理還是太麻煩了。所以下一節中我們將介紹Web框架,進一步簡化Web開發。
以上就是本節的全部內容,感謝你的閱讀。
下一節內容:Web開發之 Web框架
有任何問題與想法,歡迎評論與吐槽。
和博主一起學習Python吧( ̄▽ ̄)~*