**动态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)    收藏  举报

导航