importsocketimportmultiprocessingimportreimportdynamic.mini_frameclassWSGIServer():def __init__(self):
self.web_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.web_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
self.web_socket.bind((‘192.168.0.106‘,7890))
self.web_socket.listen(128)deftcp_serve(self, resp_socket):
recv_data= resp_socket.recv(1024).decode(‘utf-8‘)
request_lines=recv_data.splitlines()
file_name= ‘‘ret= re.match(r"[^/]+(/[^ ]*)",request_lines[0])ifret:
file_name=ret.group(1)print(file_name)if file_name == "/":
file_name= ‘\index.html‘path= r‘E:\\360Downloads\\Software\\新建文件夹\\新建文件夹\\tmag_23_Infinity‘+file_nameif not file_name.endswith(".py"):#判断是都是.py结尾,不是返回动态页面,是返回静态页面
try:
f=open(path,‘rb‘)except:
resp_data= ‘HTTP/1.1 200 OK\r\n‘ + "\r\n" + ‘.....file not find....‘resp_socket.send(resp_data.encode(‘utf-8‘))else:
html_content=f.read()
f.close()
resp_data= ‘HTTP/1.1 200 OK\r\n‘ + "\r\n"resp_socket.send(resp_data.encode(‘utf-8‘))
resp_socket.send(html_content)else:#动态页面处理
env=dict()
env[‘PATH INFO‘] =file_name#调用mini_frame框架里的application函数,返回header和body,在将两者在web服务器里组装,返回给浏览器
body =dynamic.mini_frame.application(env, self.set_response_headers)
header= ‘HTTP/1.1 %s\r\n‘ %self.statusfor temp inself.headers:
header+= "%s:%s\r\n" % (temp[0], temp[1])
header+= "\r\n"resp_data= header +body
resp_socket.send(resp_data.encode(‘utf-8‘))
resp_socket.close()defset_response_headers(self,status,headers):‘‘‘该方法用于接收mini_frame框架里返回的header数据‘‘‘self.status=status
self.headers= [(‘Server‘,‘mini_web v8.8‘)]
self.headers+=headersdefrun_forver(self):whileTrue:
resp_socket, resp_addr=self.web_socket.accept()
p= multiprocessing.Process(target=self.tcp_serve, args=(resp_socket,))
p.start()#同乌班图一样也需要关闭套接字,跟文件描述符有关,不然页面一直刷新不出来
resp_socket.close()#self.web_socket.close()
defmain():
wsgi_server=WSGIServer()
wsgi_server.run_forver()if __name__ == ‘__main__‘:
main()