WSGI原理

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 中国"
原文地址:https://www.cnblogs.com/yifengs/p/11460335.html