所谓wsig 协议 就是把web框架 和服务器进行分开 然后通过 wisg协议 进行连接 这样子可以随时替换web框架 或者 更换服务器 解耦 (现在学的内容里 静态连接一般是放在服务器里 而动态连接是放在web框架 不知道这句有没有错)
举个例子
下面是一个服务器 通过wsig 与web框架进行连接
import socket import re import multiprocessing import time import mini_frame class WSGIServer(object): def __init__(self): # 1. 创建套接字 self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 2. 绑定 self.tcp_server_socket.bind(("", 7890)) # 3. 变为监听套接字 self.tcp_server_socket.listen(128) def service_client(self, new_socket): """为这个客户端返回数据""" # 1. 接收浏览器发送过来的请求 ,即http请求 # GET / HTTP/1.1 # ..... request = new_socket.recv(1024).decode("utf-8") # print(">>>"*50) # print(request) request_lines = request.splitlines() print("") print(">"*20) print(request_lines) # GET /index.html HTTP/1.1 # get post put del file_name = "" ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0]) if ret: file_name = ret.group(1) # print("*"*50, file_name) if file_name == "/": file_name = "/index.html" # 2. 返回http格式的数据,给浏览器 # 2.1 如果请求的资源不是以.py结尾,那么就认为是静态资源(html/css/js/png,jpg等) if not file_name.endswith(".py"): try: f = open("./html" + file_name, "rb") except: response = "HTTP/1.1 404 NOT FOUND\r\n" response += "\r\n" response += "------file not found-----" new_socket.send(response.encode("utf-8")) else: html_content = f.read() f.close() # 2.1 准备发送给浏览器的数据---header response = "HTTP/1.1 200 OK\r\n" response += "\r\n" # 2.2 准备发送给浏览器的数据---boy # response += "hahahhah" # 将response header发送给浏览器 new_socket.send(response.encode("utf-8")) # 将response body发送给浏览器 new_socket.send(html_content) else: # 2.2 如果是以.py结尾,那么就认为是动态资源的请求 env = dict() # 这个字典中存放的是web服务器要传递给 web框架的数据信息 env['PATH_INFO'] = file_name # {"PATH_INFO": "/index.py"} body = mini_frame.application(env, self.set_response_header) header = "HTTP/1.1 %s\r\n" % self.status for temp in self.headers: header += "%s:%s\r\n" % (temp[0], temp[1]) header += "\r\n" response = header+body # 发送response给浏览器 new_socket.send(response.encode("utf-8")) # 关闭套接 new_socket.close() def set_response_header(self, status, headers): self.status = status self.headers = [("server", "mini_web v8.8")] self.headers += headers def run_forever(self): """用来完成整体的控制""" while True: # 4. 等待新客户端的链接 new_socket, client_addr = self.tcp_server_socket.accept() # 5. 为这个客户端服务 p = multiprocessing.Process(target=self.service_client, args=(new_socket,)) p.start() new_socket.close() # 关闭监听套接字 self.tcp_server_socket.close() def main(): """控制整体,创建一个web 服务器对象,然后调用这个对象的run_forever方法运行""" wsgi_server = WSGIServer() wsgi_server.run_forever() if __name__ == "__main__": main()
下面是通过
def index(): return "这是主页" def login(): return "这是登录页面" def application(env, start_response): start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')]) file_name = env['PATH_INFO'] # file_name = "/index.py" if file_name == "/index.py": return index() elif file_name == "/login.py": return login() else: return 'Hello World! 我爱你中国....'