Web动态服务器

来源:互联网 发布:php 输出错误信息 编辑:程序博客网 时间:2024/06/18 00:03

1.新建:03-dynamic_web_server.py

#coding=utf-8import socketimport reimport sysfrom multiprocessing import Process#需求:执行python的动态脚本#常量,所有字母全部大写#设置静态文件根目录HTML_ROOT_DIR="./html"WSGI_PYTHON_DIR="./wsgipython"class HttpServer(object):    """"""    def __init__(self):        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)        # self.server_socket.bind(("", port))    def bind(self, port):        self.server_socket.bind(("", port))    def start(self):       self.server_socket.listen(128)       while True:           # 返回一个新的客户端的套接字           client_socket, client_address = self.server_socket.accept()           # print("[%s,%s]用户连接上了!"%(client_address[0],client_address[1]))           print("[%s,%s]用户连接上了!" % client_address)           # 新建进程           handle_client_process = Process(target=self.handle_client, args=(client_socket,))           handle_client_process.start()           # client套接字关闭           client_socket.close()    # 接收状态码,响应头    def start_respone(self, status, headers):        server_header = [            ("Server", "My Server")        ]        response_headers = "HTTP/1.1" + status + "\r\n"        for header in headers:            response_headers += "%s : %s\r\n" % header        # 放在对象里面,方面后续处理        self.response_headers = response_headers    def handle_client(self, client_socket):       """处理客户端请求"""       # 获取客户端请求数据       request_data = client_socket.recv(1024)       print("request data:", request_data)       request_lines = request_data.splitlines()       for line in request_lines:           print(line)       # 解析请求报文       #  'GET / HTTP/1.1'       request_start_line = request_lines[0]       # 提取用户请求的文件名       print(request_start_line.decode("utf-8"))       file_name = re.match(r"\w+ +(/[^ ]*) ", request_start_line.decode("utf-8")).group(1)       method_name = re.match(r"(\w+) +/[^ ]* ", request_start_line.decode("utf-8")).group(1)        #"/ctime.py"       #"/sayhello.py"       if file_name.endswith(".py"):           # 动态加载模块,导入py文件,取模块名           m = __import__(file_name[1:-3])           #environ:一个包含所有HTTP请求信息的dict对象           env = {               "PATH_INFO":file_name,               "METHOD":method_name           }           #传递self.start_respone的引用,处理函数           response_body = m.application(env, self.start_respone)           response = self.response_headers + "\r\n" + response_body       else:           # 常量写在左边,变量写在右边           if "/" == file_name:               file_name = "/index.html"           # 打开文件,读取内容           try:               file = open(HTML_ROOT_DIR + file_name, "rb")           except IOError:               # 构造响应数据               response_start_line = "HTTP/1.1 404 NOT FOUND\r\n"               response_headers = "Server:My server\r\n"               response_body = "The file is not found"           else:               file_data = file.read()               file.close()               # 构造响应数据               response_start_line = "HTTP/1.1 200 OK\r\n"               response_headers = "Server:My server\r\n"               response_body = file_data.decode("utf-8")           finally:               # 形成响应报文               response = response_start_line + response_headers + "\r\n" + response_body               print("response data:", response)        # 注意编码问题        # 向客户端返回响应数据       client_socket.send(bytes(response, "utf-8"))       # 关闭客户端socket连接       client_socket.close()def main():    #动态加载路径    sys.path.insert(1,WSGI_PYTHON_DIR)    http_server=HttpServer()    http_server.bind(8000)    http_server.start()if __name__=="__main__":    main()

2.新建wsgipython目录,同时在目录里面,新建ctime.py文件

#coding=utf-8import time#"/ctime.py?timezone=8"def application(env,start_response):    env={    }    # env.get("Method")    # env.get("PATH_INFO")    # env.get("QUERY_STRING")    #起始行    status="200 OK"    #响应头    headers = [        ("Content-Type", "text/plain")    ]    start_response(status,headers)    return time.ctime()
原创粉丝点击