**动态web服务器(升级版)

1 MyWebFramework.py 2 3 import time 4 5 HTML_ROOT_DIR='./html' 6 7 class Application(): 8 '''框架的核心部分,也就是框架的主题程序,框架是通用的''' 9 def __init__(self,urls): 10 # 设置路由信息 11 self.urls=urls 12 13 def __call__(self, env, start_response): 14 #判断PATH_INFO是否存在,不存在则进入根目录 15 path=env.get('PATH_INFO','/') 16 17 # /static/index.html 判断静态文件 18 if path.startswith('/static'): 19 # 访问静态文件 20 file_dir=path[7:] 21 file_name = HTML_ROOT_DIR + file_dir 22 print(file_name) 23 24 # 打开文件读取内容 25 try: 26 file = open(file_name, 'rb') 27 except IOError: 28 status = '404 NotFund' 29 headers = [] 30 start_response(status, headers) 31 return 'not found' 32 else: 33 #static/index.html 34 response_data = file.read().decode('utf-8') 35 file.close() 36 37 status = '200 OK' 38 headers = [('Content-Type','html')] #这里注意是html格式 39 start_response(status, headers) 40 return response_data 41 42 for url,handler in self.urls: 43 #('/get_time',show_time) 44 if path==url: 45 return handler(env,start_response) 46 47 # 代表未找到路由信息,404错误 48 status='404 Not found' 49 headers=[] 50 start_response(status,headers) 51 return 'not found' 52 53 def show_time(env, start_response): 54 status='200 OK' 55 headers=[('Content-Type','text/plain')] 56 start_response(status,headers) 57 return time.ctime() 58 59 def say_hello(env, start_response): 60 status='200 OK' 61 headers=[('Content-Type','text/plain')] 62 start_response(status,headers) 63 return 'say_hello' 64 65 urls=[ 66 ('/get_time',show_time), 67 ('/sayhello',say_hello), 68 ('/',say_hello) 69 ] 70 71 app=Application(urls)
1 MyWebSever.py 2 3 '''动态web服务器''' 4 import socket 5 import re 6 import sys 7 from multiprocessing import Process 8 9 #根目录文件 10 WSGI_ROOT_DIR='./wsgi' 11 12 class HttpServer(): 13 def __init__(self,application): 14 # tcp服务器 15 self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 16 self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 让端口号可以复用 17 # 构造函数,application是框架的app 18 self.app=application 19 20 def bind(self,port): 21 self.server_socket.bind(('', port)) 22 23 def start(self): 24 self.server_socket.listen() 25 26 while True: 27 client_socket, client_addr = self.server_socket.accept() 28 # print('{}--{}'.format(client_addr[0],client_addr[1])) 29 30 client_process = Process(target=self.handle_client, args=(client_socket,)) 31 client_process.start() 32 client_socket.close() 33 34 def start_response(self,status,headers): 35 ''' status='200 OK' 36 headers=[('Content-Type','text/plain')]''' 37 response_headers = 'HTTP/1.1 '+status+'\r\n' 38 for header in headers: 39 response_headers+="{}:{}\r\n".format(header[0],header[1]) 40 self.response_headers=response_headers 41 42 def handle_client(self,client_socket): 43 '''处理客户端请求''' 44 #获取请求数据 45 request_data= client_socket.recv(1024) 46 # print('request_data:{}'.format(request_data)) 47 48 #解析请求报文 49 request_lines = request_data.decode('utf-8').splitlines() 50 request_start_line=request_lines[0] 51 52 #提取用户请求的文件名-GET /index.html HTTP/1.1-即提取出“index.html” 53 print(request_start_line) 54 file_dir=re.match(r"\w+ +(/[^ ]*) ",request_start_line).group(1) 55 method=re.match(r"(\w)+ +/[^ ]* ",request_start_line).group(1) 56 57 env={ 58 "PATH_INFO":file_dir, 59 "METHOD":method 60 } 61 62 #调用框架MyWebFramework--app 63 response_body=self.app(env,self.start_response) 64 65 #构造响应数据 66 response=self.response_headers+'\r\n'+response_body 67 print(response_body) 68 69 # 向客户端发送响应数据 70 client_socket.send(response.encode('utf-8')) 71 72 def main(): 73 sys.path.insert(1,WSGI_ROOT_DIR) 74 75 #####使用sys.argv方法,动态加载需要执行的web框架,这里要执行的是MyWebFramework框架(所以才没看到导入的模块,不要惊讶) 76 # 执行文件命令 python MyWebSever.py MyWebFramework:Application 77 if len(sys.argv)<2: 78 sys.exit('python MyWebSever.py moudle:app') 79 moudle_name,app_name=sys.argv[1].split(":") 80 # moudle_name="MyWebFramework" 字符串类型 81 # app_name="Application" 字符串类型 82 83 m=__import__(moudle_name) 84 app=getattr(m,app_name) 85 http_server=HttpServer(app) 86 http_server.bind(7000) 87 http_server.start() 88 89 if __name__ == '__main__': 90 main()
一些执行结果截图:

注意:动态加载需要执行的web框架,需要配置的地方如下:

才能以如下命令(执行文件命令 python MyWebSever.py MyWebFramework:Application)去执行文件:

posted on 2019-09-07 14:39 cherry_ning 阅读(186) 评论(0) 收藏 举报
浙公网安备 33010602011771号