1. 程式人生 > >python web自制框架之-完整服務端實現

python web自制框架之-完整服務端實現

今天我們做下服務端的完整實現,把路由與模型分開來。

首先是run函式,實現接收請求與返回客戶端資料

1.

def run(host='', port=3000):
    """
    啟動伺服器
    """
    # 初始化 socket 套路
    
    log('start at', '{}:{}'.format(host, port))
    with socket.socket() as s:
        s.bind((host, port))
        # 無限迴圈來處理請求
        while True:
            # 監聽 接受 讀取請求資料 解碼成字串
            s.listen(5)
            connection, address = s.accept()
            r = connection.recv(1000)
            r = r.decode('utf-8')
            # log('ip and request, {}\n{}'.format(address, request))
            # 因為 chrome 會發送空請求導致 split 得到空 list
            # 所以這裡判斷一下防止程式崩潰
            if len(r.split()) < 2:
                continue
            path = r.split()[1]
            # 設定 request 的 method
            request.method = r.split()[0]
            # 把 body 放入 request 中
            request.body = r.split('\r\n\r\n', 1)[1]
            # 用 response_for_path 函式來得到 path 對應的響應內容
            response = response_for_path(path)
            # 把響應傳送給客戶端
            connection.sendall(response)
            # 處理完請求, 關閉連線
            connection.close()

這個是完整的伺服器接收與返回資料(客戶端).

這裡的注意:

with socket.socket() as s:
# 使用 with 可以保證程式中斷的時候正確關閉 socket 釋放佔用的埠

request是個全域性變數,為了接收資料而設,在我上篇文章裡有介紹。

 response = response_for_path(path)

response_for_path(path)為函式,如下:

def response_for_path(path):
    path, query = parsed_path(path)
    request.path = path
    request.query = query
    log('path and query', path, query)
    """
    根據 path 呼叫相應的處理函式
    沒有處理的 path 會返回 404
    """
    r = {
        '/static': route_static,
        # '/': route_index,
        # '/login': route_login,
        # '/messages': route_message,
    }
    r.update(route_dict)
    response = r.get(path, error)
    log('request',response(request))
    return response(request)

這裡的注意:

 path, query = parsed_path(path)

parsed_path是得路徑與引數,具體程式碼就不貼了,如果需要,可以留言。

path裡是路徑,query裡存的引數。

 r = {
        '/static': route_static,
        # '/': route_index,
        # '/login': route_login,
        # '/messages': route_message,
    }

這裡,我們剛開始是在這裡存路由,現在我們把路由放在別的檔案中,所以,這裡只是放著靜態檔案的路徑。

r.update(route_dict)

r更新,把route_dict裡的路徑新增進去。如下

route_dict = {
    '/': route_index,
    '/login': route_login,
    '/register': route_register,
    '/messages': route_message,
}

到這裡,我們就完成了簡單的mvc模式分離的一部分。