写一个Python 1、通过select实现的最简单的web框架2、通过wsgiref实现的web框架
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()
#!/usr/bin/env python # -*- coding: utf-8 -*- from wsgiref.simple_server import make_server # 下面2个视图函数 def indexfunc(request): f=open(r'templates/index.html','rb') data=f.read() f.close() print('执行了indexfunc') return [data] def loginfunc(request): request_method=request.get('REQUEST_METHOD') if request_method=='GET': f = open(r'templates/login.html', 'rb') data = f.read() f.close() print('执行了login') return [data] # 路由 routers=[ ('/index',indexfunc), ('/login',loginfunc), ] drouters=dict(routers) def application(environ,start_response): start_response('200 ok',[('Content-Type','text/html')]) path=environ.get('PATH_INFO') print(path) if drouters.get(path): print('yeah') return drouters.get(path)(environ) else: return [b'<h1>404<h1>'] t=make_server('127.0.0.1',8989,application) t.serve_forever()