1. 程式人生 > >wsgiref手寫一個web服務端

wsgiref手寫一個web服務端

'''

通過wsgiref寫一個web服務端
先講講wsgiref吧,基於網路通訊其根本就是基於socket,
所以wsgiref同樣也是通過對socket進行封裝,避免寫過
多的程式碼,將一系列的操作封裝成一個方法(函式),這樣大大減少程式碼量

'''

from wsgiref.simple_server import make_server


def index(env):
    return 'index'


def see_time(env):
    return 'time'


def user(env):
    return 'user'


urls = [
    (
'/index', index), ('/time', see_time), ('/user', user), ] # 這裡我們通過路由的方式,一個url對應一個檢視函式,在那個檢視函式中我們可以寫一系列的邏輯程式碼 def run(env, response): response("200 OK", [('Content-type', 'text/html')]) # env是瀏覽器請求帶來的資料,進行一些列處理得到的字典,通過字典得到它請求的url # 我們再通過url進行判斷,並返回其相應的頁面 position = env['PATH_INFO'] function
= None for url in urls: if url[0] == position: function = url[1] break if function: info = function(env) else: info = '404' return [info.encode('utf-8')] if __name__ == '__main__': server = make_server('127.0.0.1', 8008, run) print
('8008埠監聽。。。') server.serve_forever() # 讓伺服器永遠啟動

 

'''
make_server這是一個函式,雖然看了一點點原始碼,但還是不太懂,但是大概的意思應該是
make_server('127.0.0.1', 8008, run),前兩個埠,它幫我們綁定了服務端的ip端
口,然後就是再那裡等待客戶端去連線,當有客戶端連線的時候,將客戶端請求帶來的資料,
進行一些列的處理(處理方法大概和上一篇socket處理字串的方法一樣吧,也有不同的),
得到一個數據字典當作引數傳入第三個引數(run函式),然後將一個物件的方法當作引數作為
第二個引數傳入。
第二個引數的作用大概是就是首先發送(上一篇socket.send('HTTP/1.1 200 ok\r\n\r\n''))
效果一樣的程式碼。

'''

 

# 這個相對於上一篇我寫的簡單了許多,但也要理解make_server是怎麼執行的,雖然看不懂原始碼,
# 但可以通過實現效果反推測出它怎麼執行的,還要理解run函式中的兩個引數。


# 如果你還想再新增訪問的頁面,首先你要在url中新增url和對應的檢視函式。
# 再去寫檢視函式,下面的程式碼不用去動