mini-web
一、面向对象的多进程web服务器
"""
webserver.py
使用面向对象的方法来做多进程的web server
"""
import socket
import re
import multiprocessing
class WSGIServer(object):
"""服务器对象"""
def __init__(self):
# 创建套接字
self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定ip和port
self.tcp_server.bind(("", 8080))
# 设置成监听模式
self.tcp_server.listen(128)
def service_client(self, new_socket):
# 接受数据
data = new_socket.recv(1024).decode("utf-8")
# print(data.decode("utf-8"))
data_list = data.splitlines()
# print(data_list[0])
# 正则匹配出文件名 'GET /img/home/tour8.jpg HTTP/1.1',
ret = re.match(r"[^/]+(/[^ ]*)",data_list[0])
print(ret)
file_name = ""
if ret:
file_name = ret.group(1)
print(file_name)
if file_name == "/":
file_name = "/index.html"
try:
# 打开文件
f = open("..//..//static/html/Trave" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "Not Found"
# 发送文件 header
new_socket.send(response.encode("utf-8"))
else:
# 传递数据
response = "HTTP:/1.1 200 OK\r\n"
response += "\r\n"
data_contend = f.read()
f.close()
# 发送文件 header
new_socket.send(response.encode("utf-8"))
# 发送文件body
new_socket.send(data_contend)
# 关闭套接字
new_socket.close()
def run_forerver(self):
"""使程序一直运行"""
while True:
# 等待客户端连接
new_client, addr = self.tcp_server.accept()
p = multiprocessing.Process(target=self.service_client, args=(new_client, ))
# 接受客户端的消息 回复客户端的消息
# service_client(new_client)
p.start()
new_client.close() # 多进程中会复制一份这个变量,所以要在主进程中也要关闭
self.tcp_server.close()
def main():
"""控制整体流程 --> 创建一个对象 --> 调用这个对象的run_forerver方法"""
wsgi_server = WSGIServer()
wsgi_server.run_forerver()
if __name__ == "__main__":
main()
二、让web服务器支持动态解析
-
解释:当浏览器请求文件以.py结尾的就当做动态网页
-
代码
""" webserver.py 使用面向对象的方法来做多进程的web server 继承了动态的解析功能 当请求文件结尾以.py结尾的为动态网页 """ import socket import re import multiprocessing import time class WSGIServer(object): """服务器对象""" def __init__(self): # 创建套接字 self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定ip和port self.tcp_server.bind(("", 8080)) # 设置成监听模式 self.tcp_server.listen(128) def service_client(self, new_socket): # 接受数据 data = new_socket.recv(1024).decode("utf-8") # print(data.decode("utf-8")) data_list = data.splitlines() # print(data_list[0]) # 正则匹配出文件名 'GET /img/home/tour8.jpg HTTP/1.1', ret = re.match(r"[^/]+(/[^ ]*)",data_list[0]) print(ret) file_name = "" if ret: file_name = ret.group(1) print(file_name) if file_name == "/": file_name = "/index.html" if not file_name.endswith('.py'): try: # 打开文件 f = open("..//..//static/html/Trave" + file_name, "rb") except: response = "HTTP/1.1 404 NOT FOUND\r\n" response += "\r\n" response += "Not Found" # 发送文件 header new_socket.send(response.encode("utf-8")) else: # 传递数据 response = "HTTP:/1.1 200 OK\r\n" response += "\r\n" data_contend = f.read() f.close() # 发送文件 header new_socket.send(response.encode("utf-8")) # 发送文件body new_socket.send(data_contend) else: # 以.py结尾的则为动态的获取的页面 header = "HTTP:/1.1 200 OK\r\n" header += "\r\n" body = "nihao : %s" % time.ctime() response = header + body # 发送消息 new_socket.send(response.encode("utf-8")) # 关闭套接字 new_socket.close() def run_forerver(self): """使程序一直运行""" while True: # 等待客户端连接 new_client, addr = self.tcp_server.accept() p = multiprocessing.Process(target=self.service_client, args=(new_client, )) # 接受客户端的消息 回复客户端的消息 # service_client(new_client) p.start() new_client.close() # 多进程中会复制一份这个变量,所以要在主进程中也要关闭 self.tcp_server.close() def main(): """控制整体流程 --> 创建一个对象 --> 调用这个对象的run_forerver方法""" wsgi_server = WSGIServer() wsgi_server.run_forerver() if __name__ == "__main__": main()
三、将服务器与逻辑处理分开实现解耦
- 版本一:
-
webserver.py 服务器代码
""" 使用面向对象的方法来做多进程的web server 继承了动态的解析功能 当请求文件结尾以.py结尾的为动态网页 将web框架与逻辑处理的代码分开 """ import socket import re import multiprocessing import time import mini_frame class WSGIServer(object): """服务器对象""" def __init__(self): # 创建套接字 self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定ip和port self.tcp_server.bind(("", 8080)) # 设置成监听模式 self.tcp_server.listen(128) def service_client(self, new_socket): # 接受数据 data = new_socket.recv(1024).decode("utf-8") # print(data.decode("utf-8")) data_list = data.splitlines() # print(data_list[0]) # 正则匹配出文件名 'GET /img/home/tour8.jpg HTTP/1.1', ret = re.match(r"[^/]+(/[^ ]*)",data_list[0]) print(ret) file_name = "" if ret: file_name = ret.group(1)
-