python mini_Web 實現端口號和框架動態訪問

服務器端

import socket
import multiprocessing
import re
# import dynamic.Frame
import sys

class WISG_Server(object):
    #初始化-創建-地址複用-綁定-監聽

    def __init__(self,port,app):

        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(("",port))
        self.tcp_server_socket.listen(128)
        self.application = app
    # 新客戶端鏈接,啓動新客戶端
    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("./static"+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
            body= self.application(environ,self.start_response)

            #header = 狀態 + 相應頭
            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():
    # 自定義端口
    if len(sys.argv) == 3:
        try:
            port = int(sys.argv[1]) # 7890
            frame_app_name = sys.argv[2] #Frame:application
       
        except Exception as ret:
            print("輸入端口有誤")
            return
    else:
        print("請按照以下方式運行")
        print("python3 xxxx.py 7890 Frame:application")
        return

    # 自定義框架名
    ret = re.match(r"([^:]+):(.*)",frame_app_name)
    if ret:
        frame_name = ret.group(1)
        app_name = ret.group(2)
    else:
        print("請按照以下方式運行")
        print("python3 xxxx.py 7890 Frame:application")
        return

    sys.path.append("./dynamic")
    frame = __import__(frame_name) # 返回值標記着導入的模塊
    app = getattr(frame,app_name) #此時app指向dynamic下的Frame

    print (app)

    
    wisg = WISG_Server(port,app)
    wisg.run_forever()


if __name__ == "__main__":
    main()

框架

import re 
def center():
	with open ("./template/center.html") as f:
		content = f.read()
	# 替換模板數據 
	con_info = "這是個人中心"
	content = re.sub(r"\{%content%\}",con_info,content)
	return content

def index():
	with open ("./template/index.html") as f:
		content = f.read()
	con_info = "這是股票信息"
	content = re.sub(r"\{%content%\}",con_info,content)
	return content

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 =="/center.py":
		return center()

	else:
		return "。。。。"

頁面端展示
在這裏插入圖片描述
在命令行按照格式輸入即可訪問網頁。
在命令行輸入

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章