Web- mini_server.py
# 导入模块
import socket,re,multiprocessing
import mini_frame # WSGI网关接口
class WSGIServer():
def __init__(self,port):
# 创建套接字
self.tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 设置套接字选项,允许端口复用
self.tcp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADRR,1)
# 绑定服务器本地信息
self.tcp_socket.bind(('',port))
def re_client(self):
'''完成对客户端浏览器的服务'''
# 接收客户端的数据
recv_data = new_socket.recv(1024).decode('utf-8')
# 按行切割,将数据生成一个列表
request_lines = recv_data.splitlines()
# 判断列表是否有内容
if not request_lines:
print('您的列表为空,请重新检查')
return
else:
request = request_lines[0]
ret = re.match(r"[^/]+(/[^ ]*)",request)
if not ret:
print('您的正则表达式未匹配成功,请重新检查')
return
else:
file_name = ret.group(1)
if file_name =='/':
file_name = './index.html'
# 如果访问不是以.py结尾的 则暂定访问静态资源
if not file_name.endswith('.py'):
try:
f = open('./static'+file_name,'rb')
except:
# 响应报文
response_body = '--------NOT FOUND PAGE-----------'
# 响应头
response_header = 'HTTP/1.1 404 NOT FOUND \r\n'
response_header += 'Content-length:%d \r\n' % len(response_body.encode('utf-8')
response_header += '\r\n'
response = response_header.encode('utf-8')+response_body.encode('utf-8')
# 发送给web浏览器数据
new_socket.send(response)
else:
response_body = f.read()
f.close()
response_header = 'HTTP/1.1 200 OK \r\n'
response_header += 'Content-Type:text/html;charset=utf-8 \r\n'
response_header += 'Content-length%d \r\n' % len(response_body)
response_header += '\r\n'
response = response_header.encode('utf-8')+response_body
new_socket.send(response)
else:
env = dict()
env['PATH_INTO'] = file_name
response_bady = mini_frame.application(env,server_frame)
response_header = 'HTTP/1.1 %s \r\n' % self.status
for temp in self.header:
response_header +='%s:%s\r\n' % (temp[0],temp[1])
response_header += '\r\n'
response = response_header.encode('utf-8')+response_bodt.encode('utf-8')
new_socket.send(response)
# 关闭套接字
new_socket.close()
def server_frame(self,status,header):
'''对应WSGI网关接口'''
self.status =status
self.header = [('Server','mini_web v8.1')]
self.header += header
def run_server(self):
'''启动web-浏览器整体控制'''
# 循环web浏览器服务
while True:
# 等待这个新客户端的连接
new_socket,new_addr = self.tcp_socket.accept()
# 创建进程,并为这个客户端服务
p = multiprocessing.Process(target=self.re_client,args=(new_socket,))
# 启动进程
p.start()
# 关闭套接字
new_socket.close()
def main():
'''完成web服务器的整体控制'''
wsgi_server = WSGIServer(port)
wsgi_server.run_server()
if __name__ == '__main__':
main()
Web - mini_frame.py
import time,re
def index():
with open('./templates/index.html') as f:
coutent = f.read()
my_sock_info = '这是主页内容'
coutent = re.sub(r'\{%content%\}' , my_sock_info)
return coutent
def center():
with open('./templates/center.html') as f:
coutent = f.read()
my_sock_info = '这是个人中心来自mysql数据库的数据'
coutent = re.sub(r'\{%content%\}',my_sock_info)
return cuntent
def application(env,server_frame):
status = '200 OK'
header= [('Content-Type','text/html;charset=utf-8')]
server_frame(status,header)
file_name = env['PATH_INTO’]
if file_name == '/index.py':
return index()
elif file_name == 'center.py':
return center()
else:
print('-----NOT FOUND PAGE------')