python-WSIG協議下的服務器與框架分離

web 服務器和框架分離

首先實現的是 Web服務器

import socket
import multiprocessing
import re
import Frame


class WISG_Server(object):

    def __init__(self):

        self.tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        self.tcp_server_socket.bind(("",8080))
        self.tcp_server_socket.listen(128)
        
    def run_forever(self):
        while True:
            new_client_socket,new_client_addr = self.tcp_server_socket.accept()
            p = multiprocessing.Process(target = self.serve_client_socket,args =(new_client_socket,))
            p.start()
            new_client_socket.close()
        self.tcp_server_socket.close()    

    def serve_client_socket(self,new_client_socket):
        #接收瀏覽器發送的請求,即http請求
        #GET/HTTP/1.1
        request = new_client_socket.recv(1024).decode("utf-8")
        request_lines = request.splitlines()

        #GET /index.html HTTP/1.1
        file_name = ""
        ret =re.match(r"[^/]+(/[^ ]*)",request_lines[0])
        if ret:
            file_name = ret.group(1)
            if file_name == "/":
                file_name = "/index.html"

        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_client_socket.send(response.encode("utf-8"))

            else:
                html_content = f.read()
                f.close()
                response = "HTTP/1.1 200 OK\r\n"
                response += "\r\n"
                new_client_socket.send(response.encode("utf-8"))
                new_client_socket.send(html_content)
        else:
            environ = dict()
            environ['PATH_INFO'] = file_name
            body= Frame.application(environ,self.start_response)
            header = "HTTP/1.1 %s \r\n" % self.status
            for temp in self.headers:
               header += "%s:%s\r\n" %(temp[0],temp[1] )
           # 3.空一行與body隔開
            header += "\r\n"
        
           # 設置返回的瀏覽器的內容
            response = header + body
            new_client_socket.send(response.encode("utf-8"))
        new_client_socket.close()

    def start_response(self,status,headers):
        self.status = status
        self.headers = headers

def main():
    wisg = WISG_Server()
    wisg.run_forever()


if __name__ == "__main__":
    main()

然後實現的是簡易框架

def index():
	return "這是主頁"

def login():
	return "這是登錄頁面"

def application(environ,start_response):
	start_response("200 OK",[("Content-Type","text/html;charset=utf-8")])
	file_name = environ['PATH_INFO']
	if file_name =="/index.py":
		return index()
	elif file_name =="/login.py":
		return login()
	else:
		return "我愛你中國。。。。"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章