迷你web框架 面向对象-动态解析服务器

 

服务器:

import socket
import re
import multiprocessing
import delme
import sys

class WSGI():
    def __init__(self,port):
        self.conn = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.conn.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        self.conn.bind(("",port))
        self.conn.listen(128)

    def server_client(self,new_socket):
        request = new_socket.recv(1024).decode("utf-8")
        print("********",request)
        request_lines = request.splitlines()
        
        contents = re.match(r"[^/]*(/[^ ]*)",request_lines[0])

        if contents:
            file_name = contents.group(1)
            print("-------group",file_name)
            if file_name == "/":
                file_name = "/index.html"

        if not file_name.endswith(".py"):
            try:
                response = open("./html" + file_name, "rb")
            except:
                response = "HTTP/ 1.1 404 NOT FOUND\r\n"
                response += "\r\n"
                response += "page not found.."
                new_socket.send(response.encode('utf-8'))

            else:   
                new_response = response.read()
                response.close()

                head = "HTTP/ 1.1 200 OK\r\n"
                head += "\r\n"

                new_socket.send(head.encode("utf-8"))
                new_socket.send(new_response)
        else:
            dic =dict()
            dic["path_info"] = file_name
            temp = delme.application(dic,self.set_respons_header)
            head = "HTTP/ 1.1 %s\r\n" % self.stauts
        
            for i in self.type:
                head += "%s:%s\r\n" % (i[0],i[1])
            head += "\r\n"
            res = head + temp
            new_socket.send(res.encode("utf-8"))

    
        new_socket.close()

    def set_respons_header(self,stauts,ty):
            self.stauts = stauts
            self.type = ty


    def run(self):
        while True:
            new_socket,addr = self.conn.accept()
            p = multiprocessing.Process(target=self.server_client,args=(new_socket,))
            p.start()
            new_socket.close()

def main():
    if len(sys.argv) == 2:
        try:
    
            port = int(sys.argv[1])

        except:
            print("prot is not right")
            return
    else:
        print("format no right")
        return
    server = WSGI(port)
    server.run()

if __name__ == '__main__':
    main()

web框架:

def login():

    return "this is login"

def index():
    with open("./html/index.html") as f:
        return f.read()



def application(evn,func):
    func("200 OK",[('Content-Type','text/html;charset=utf-8'),])
    print("--------",evn,"----------")
    if evn["path_info"] == "/index.py":
        return index()
    elif evn["path_info"] == "/login.py":
        return login()
    else:
        return 'hello world...'

 web框架改进,用装饰器加路由:

ROU_DIC =  dict()

def router(url):
    def set_func(func):
        ROU_DIC[url] = func
        def call_func():
            return func()
        return call_func
    return set_func

@router('/login.py')
def login():
    return "this is login"

@router("/index.py")
def index():
    with open("./html/index.html") as f:
        return f.read()


def application(evn,func):
    func("200 OK",[('Content-Type','text/html;charset=utf-8'),])
    print("--------",evn,"----------")
    # if evn["path_info"] == "/index.py":
    #     return index()
    # elif evn["path_info"] == "/login.py":
    #     return login()
    # else:
    #     return 'hello world...'
    a = evn["path_info"]
    print("---8888888888------",a)
    return ROU_DIC[a]()
    

 

posted @ 2019-02-03 22:48  greenfan  阅读(120)  评论(0)    收藏  举报