1. 程式人生 > >【Python入門】47.Web開發之 WSGI介面

【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用一個包含兩個strtuple表示,這裡('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吧( ̄▽ ̄)~*