• [转] Python实现简单的Web服务器


    
    
    链接: https://www.shiyanlou.com/courses/552

    #
    -*- 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 = """ <html> <body> <h1>Error accessing {path}</h1> <p>{msg}</p> </body> </html> """ 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()

    plain.html

    <html>
    <head>
    <title>Plain Page</title>
    </head>
    <body>
    <h1>Plain Page</h1>
    <p>Nothin' but HTML.</p>
    </body>
    </html>

    index.html

    <html>
    <head>
    <title>Index Page</title>
    </head>
    <body>
    <h1>Index Page</h1>
    <p>Welcome to my home.</p>
    </body>
    </html>

    showtime.py

    from datetime import datetime
    print '''
    <html>
    <body>
    <p>Generated {0}</p>
    </body>
    </html>'''.format(datetime.now())
  • 相关阅读:
    Gym
    HDU 4087 ALetter to Programmers (三维坐标旋转 矩阵 + 矩阵快速幂)
    POJ 3845 Fractal (向量旋转,好题)
    HDU 1700 Points on Cycle (向量旋转 + 圆内接三角形周长和面积最大的是正三角形)
    POJ 1271 Nice Milk (半平面交应用)
    POJ 2540 Hotter Colder (半平面交应用 + 向量旋转)
    luoguP3705 [SDOI2017]新生舞会
    luoguP4123 [CQOI2016]不同的最小割
    luoguP2046 [NOI2010]海拔
    luoguP3227 [HNOI2013]切糕
  • 原文地址:https://www.cnblogs.com/tlmn2008/p/8963362.html
Copyright © 2020-2023  润新知