1. 程式人生 > >寫一個Python通過select實現的最簡單的web框架

寫一個Python通過select實現的最簡單的web框架

127.0.0.1 log put lec func select odi block pos

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 import socket
 5 import select
 6 
 7 
 8 class MyRequest:
 9     """
10     從請求頭請求體獲取的信息封裝的request對象中
11     """
12     def __init__(self,data):
13         header_body=data.decode(utf-8)
14         header_str,body_str=header_body.split(\r\n\r\n
) 15 header_list=header_str.split(\r\n) 16 method,url,protocal=header_list[0].split( ) 17 18 header_dict={} 19 20 for i in range(1,len(header_list)): 21 k,v =header_list[i].split(:,1) 22 header_dict[k]=v 23 24 self.method=method
25 self.url=url 26 self.headers=header_dict 27 28 29 class MyResponse: 30 """ 31 處理服務端要返回給瀏覽器的數據,相當於HTTPResponse或render 32 """ 33 def __init__(self,data): 34 self.data=data 35 self.base_data=HTTP/1.1 200 OK\r\n\r\n<html><head><meta charset="UTF-8"></head><body><h1>{0}</h1></body></html>
36 def myrender(self): 37 return self.base_data.format(self.data).encode(utf-8) 38 39 40 # 下面2個簡單的視圖函數 41 def index(request): 42 return MyResponse(index page).myrender() 43 44 def login(request): 45 return MyResponse(login page).myrender() 46 47 48 # 路由系統 49 routers=[ 50 [/index,index], 51 [/login,login], 52 ] 53 54 55 sk=socket.socket() 56 sk.setblocking(False) 57 sk.bind((127.0.0.1,8080)) 58 sk.listen(5) 59 60 inputs=[sk,] # 套接字接聽對象,是socket或conn的一個或多個 61 62 while True: 63 rList,wList,eList=select.select(inputs,[],[],2) 64 # 讀,寫,錯誤 3個列表 65 for server in rList: 66 if server==sk: 67 conn,addr=sk.accept() 68 inputs.append(conn) 69 else: 70 header_body_bytes=server.recv(8096) 71 request=MyRequest(header_body_bytes) 72 view_method=None 73 for view_function in routers: 74 # 根據請求url通過路由交給不同的視乎函數處理 75 if request.url == view_function[0]: 76 view_method=view_function[1] 77 break 78 if not view_method: 79 response=MyResponse(404).myrender() 80 else: 81 response=view_method(request) 82 server.sendall(response) 83 inputs.remove(server) 84 server.close()

寫一個Python通過select實現的最簡單的web框架