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('
')
15 header_list=header_str.split('
')
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
<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()