python web自制框架之-完整服務端實現
阿新 • • 發佈:2019-01-30
今天我們做下服務端的完整實現,把路由與模型分開來。
首先是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模式分離的一部分。