1、web-server文件下有index.html,plain.html,server.py,time.py文件
from http.server import BaseHTTPRequestHandler, HTTPServer import subprocess, os class base_case(object): '''条件处理基类''' def handle_file(self, handler, full_path): try: with open(full_path, 'rb') as reader: content = reader.read() handler.send_content(content) except IOError as msg: msg = "'{0} cannot be read: {1}'".format(full_path, msg) handler.send_error(msg) def index_path(self, handler): return os.path.join(handler.full_path, 'index.html') # 要求子类必须实现的接口 def test(self, handler): assert False, 'Not implemented' def act(self, handler): assert False, 'Not implemented' class ServerException(Exception): '''服务器内部错误''' pass class case_directory_index_file(base_case): '''条件处理类''' # 判断目标路径是否是目录&&目录下是否有index.html def test(self, handler): return os.path.isdir(handler.full_path) and os.path.isfile(self.index_path(handler)) # 响应index.html的内容 def act(self, handler): self.handle_file(handler, self.index_path(handler)) class case_no_flie(base_case): '''该路径不存在''' def test(self, handler): return not os.path.exists(handler.full_path) def act(self, handler): raise ServerException("'{0}' not found".format(handler.path)) class case_existing_file(base_case): '''该路径是文件''' def test(self, handler): return os.path.isfile(handler.full_path) def act(self, handler): self.handle_file(handler, handler.full_path) class case_always_fail(base_case): '''所有情况都不符合时的默认处理类''' def test(self, handler): return True def act(self, handler): raise ServerException("Unknown object '{0}'".format(handler.path)) class case_cgi_file(base_case): '''脚本文件处理''' def run_cgi(self, handler): data = subprocess.check_output(['python3', handler.full_path],shell=False) handler.send_content(data) def test(self, handler): return os.path.isfile(handler.full_path) and handler.full_path.endswith('.py') def act(self, handler): # 运行脚本文件 self.run_cgi(handler) class RequestHandler(BaseHTTPRequestHandler): '''处理请求并返回页面''' # 错误页面模板 Error_Page = """ <html> <body> <h1>Error accessing {path}</h1> <p>{msg}</p> </body> </html> """ # 所有可能的情况 # 注意这里的顺序, 需要先判断是否是需要执行的脚本文件,再判断是否是普通文件 Cases = [case_no_flie(), case_cgi_file(), case_existing_file(), case_directory_index_file(), case_always_fail()] # 处理一个get请求 def do_GET(self): try: # 文件完整路径 self.full_path = os.getcwd() + self.path # 遍历所有可能情况 for case in self.Cases: if case.test(self): # 调用相应的act函数 case.act(self) break # 处理异常 except Exception as msg: self.handle_error(msg) # 返回内容给客户端 def send_content(self, page, status=200): self.send_response(status) self.send_header('Content-Type', 'text/html') self.send_header('Content-Length', str(len(page))) self.end_headers() self.wfile.write(page) # 错误处理函数 def handle_error(self, msg): content = self.Error_Page.format(path=self.path, msg=msg) self.send_content(content.encode('utf-8'), 404) if __name__ == '__main__': serverAddress = ('127.0.0.1', 8080) server = HTTPServer(serverAddress, RequestHandler) server.serve_forever()