博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转) Python 实现简单的Web服务器
阅读量:6865 次
发布时间:2019-06-26

本文共 4069 字,大约阅读时间需要 13 分钟。

hot3.png

一个Python 实现的简单HTTP服务器源码:

 

#-*- coding:utf-8 -*-import sys, os, BaseHTTPServer, subprocess#-------------------------------------------------------------------------------class ServerException(Exception):    '''服务器内部错误'''    pass#-------------------------------------------------------------------------------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.handle_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 case_no_file(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_cgi_file(base_case):    '''可执行脚本'''    def run_cgi(self, handler):        data = subprocess.check_output(["python", handler.full_path])        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 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_directory_index_file(base_case):    '''在根路径下返回主页文件'''    def test(self, handler):        return os.path.isdir(handler.full_path) and \               os.path.isfile(self.index_path(handler))    def act(self, handler):        self.handle_file(handler, self.index_path(handler))#-------------------------------------------------------------------------------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 RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):    '''    请求路径合法则返回相应处理    否则返回错误页面    '''    Cases = [case_no_file(),             case_cgi_file(),             case_existing_file(),             case_directory_index_file(),             case_always_fail()]    # 错误页面模板    Error_Page = """\                        

Error accessing {path}

{msg}

""" def do_GET(self): try: # 得到完整的请求路径 self.full_path = os.getcwd() + self.path # 遍历所有的情况并处理 for case in self.Cases: if case.test(self): case.act(self) break # 处理异常 except Exception as msg: self.handle_error(msg) def handle_error(self, msg): content = self.Error_Page.format(path=self.path, msg=msg) self.send_content(content, 404) # 发送数据到客户端 def send_content(self, content, status=200): self.send_response(status) self.send_header("Content-type", "text/html") self.send_header("Content-Length", str(len(content))) self.end_headers() self.wfile.write(content)#-------------------------------------------------------------------------------if __name__ == '__main__': serverAddress = ('', 8080) server = BaseHTTPServer.HTTPServer(serverAddress, RequestHandler) server.serve_forever()

 

转载于:https://my.oschina.net/CandyMi/blog/720967

你可能感兴趣的文章