web_server:
1 import socket 2 import time 3 import multiprocessing 4 import re 5 import mini_frame 6 7 class WSGIServer(object): 8 def __init__(self): 9 # 1.创建socket对象 10 self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 11 # 2.设置重复使用地址 12 self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 13 # 3.绑定端口 14 self.tcp_server_socket.bind(("", 7890)) 15 # 4.设置监听状态 16 self.tcp_server_socket.listen(128) 17 18 def clinet_server(self,new_client_socket): 19 # 1.接受消息 20 request = new_client_socket.recv(1024).decode("utf-8") 21 lines = request.splitlines() 22 # 2.匹配请求网页 23 request_name = re.match(r"[^/]+(/[^ ]*)",lines[0]) 24 file_name = request_name.group(1) 25 if file_name == "/": 26 file_name = "/index.html" 27 28 # 返回数据给浏览器 29 if not file_name.endswith(".py"): 30 # 3.打开文件 31 try: 32 f = open("./html" + file_name,"rb") 33 except Exception as ret: 34 pass 35 else: 36 html_content = f.read() 37 38 # 4.创建header和body 39 response_body = html_content 40 response_header = "HTTP/1.1 200 ok " 41 response_header += "Content-Length:%d " % len(response_body) 42 response_header += " " 43 response = response_header.encode("utf-8") + response_body 44 # 5.发送 45 new_client_socket.send(response) 46 finally: 47 f.close() 48 else: 49 # 如果是.py结尾,则认为是动态页面请求/ 50 env = dict(); 51 env['PATH_INFO'] = file_name 52 # application(字典, 方法名) 固定用法 53 body = mini_frame.application(env, self.start_respones_header) 54 # 拼装header头 55 header = "HTTP/1.1 %s " % self.status 56 for temp in self.headers: 57 header += "%s:%s " % (temp[0], temp[1]) 58 header += " " 59 # 拼装返回数据 60 response = header + body 61 # 发送数据 62 new_client_socket.send(response.encode("utf-8")) 63 64 # 6.关闭socket 65 # new_client_socket.close() 66 67 def start_respones_header(self, status, headers): 68 """接受并保存application传过来的值""" 69 self.status = status 70 self.headers = [("server","mini_web v1.0")] 71 self.headers += headers 72 73 74 def run_forever(self): 75 """运行""" 76 while True: 77 # 5.接收客户地址,创建新socket 78 new_client_socket,client_addr = self.tcp_server_socket.accept() 79 # 6.为新客户端服务 80 p = multiprocessing.Process(target=self.clinet_server,args=(new_client_socket,)) 81 p.start() 82 # 7.关闭新客户端 83 new_client_socket.close() 84 # 7.关闭socket 85 self.tcp_server_socket.close() 86 87 def main(): 88 wsgi_server = WSGIServer() 89 wsgi_server.run_forever() 90 91 if __name__ == '__main__': 92 main()
mini_frame.py:
1 def login(): 2 """模拟登陆页面""" 3 return "---login---welcome to python--->time:%s" % time.ctime() 4 5 def index(): 6 """模拟主页""" 7 return "----index----" 8 9 def application(env, start_respones): 10 # 调用传过来的方法,传值 11 start_respones('200 ok',[("Content-Type","text/html;charset=utf-8")]) 12 # 接受字典传过来的数据 13 file_name = env['PATH_INFO'] 14 # 判断客户请求 15 if file_name == "/index.py": 16 return index() 17 elif file_name == "/login.py": 18 return login() 19 else: 20 return "python 中国"