Python最简单HTTP服务器与MVC

😂 这篇文章最后更新于1132天前,您需要注意相关的内容是否还可用。
目录导航
  • socket模拟HTTP服务
  • 利用Tornado库
  • socket模拟HTTP服务

    基于socket开发,监听127.0.0.1任一端口,如:8888,接收监听到的数据,并通过conn以HTTP响应的格式返回数据

    import socket
    
    sock = socket.socket()
    sock.bind(("localhost", 8888))  # 绑定监听的IP地址与端口8800
    sock.listen(5)  # 设置最大监听数
    
    while True:
        conn, addr = sock.accept()
        data = conn.recv(1024)
        print(data)  # 打印查看请求头与请求体
    
        # 必须以HTTP响应头的格式返回数据,否则浏览器无法正常解析
        # 同时注意send的数据不能是str字符串,必须是bytes,否则会报错。
        conn.send(b'HTTP/1.1 200 OK\r\n\r\n <h1>Hello world!</h1>')
    
        conn.close()

    浏览器访问localhost:8800,即可看到网页结果,http response中响应体前必须有两空行’ \r\n\r\n’ 否则会被认为是响应头的内容

    https://blog.csdn.net/qq_29941979/article/details/107871763

    Tornado库 class="reference-link" href="#">利用Tornado

    my.py

    import tornado.ioloop
    import tornado.web
    
    #访问地址 http://127.0.0.1:9870/main?ywdm=06&num1=10&num2=200
    
    class TestClassA:
        def sub(self,a,b):
            return a-b
        def add(self,a,b):
            return a+b
        def chen(self,a,b):
            return a*b
    
    class TestClassB:
        def sub(self,a,b):
            return a-b
        def add(self,a,b):
            return a+b
        def chen(self,a,b):
            return a*b
    
    
    sys_config={}
    sys_config["01"]=['mymvc','TestClassA','add']
    sys_config["02"]=['mymvc','TestClassA','sub']
    sys_config["03"]=['mymvc','TestClassA','chen']
    sys_config["04"]=['mymvc','TestClassB','add']
    sys_config["05"]=['mymvc','TestClassB','sub']
    sys_config["06"]=['mymvc','TestClassB','chen']
    
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
    
    
            ywdm=self.get_argument('ywdm')
            num1=int(self.get_argument('num1').encode('utf-8'))
            num2=int(self.get_argument('num2').encode('utf-8'))
    
            message="hello !"
    
            print type(num2)
            if ywdm in sys_config:
                my_module_name=sys_config[ywdm][0]
                my_class_name=sys_config[ywdm][1]
                my_method_name=sys_config[ywdm][2]
    
                my_module = __import__(my_module_name)
                my_class = getattr(my_module,my_class_name) 
                my_obj = my_class() 
                my_method = getattr(my_obj,my_method_name)
                ret=my_method(num1,num2)
                print "ret:",ret
                #message = "ret data:::"+ret
                message="ywdm:"+ywdm+"-data:"+str(ret)
    
            items = ["Item 1", "Item 2", "Item 3"]
            self.render("test.html", title="My title", items=items,config_items=sys_config)
    
    
    
            #self.write(message)
            #self.finish()
    
    
    
    
    
    application = tornado.web.Application([(r"/main", MainHandler),])
    
    if __name__ == "__main__":
        application.listen(9870)
        tornado.ioloop.IOLoop.instance().start()

    test.html

    <html>
       <head>
          <title>{{ title }}</title>
       </head>
       <body>
         <ul>
           {% for item in items %}
             <li>{{ escape(item) }}</li>
           {% end %}
         </ul>
    
         <ul>
           {% for item in config_items %}
             <li>{{ escape(config_items[item][0]) }}
             -{{ escape(config_items[item][1]) }}
    
             -{{ escape(config_items[item][2]) }}
             </li>
           {% end %}
         </ul>
    
    
       </body>
     </html>

    https://blog.csdn.net/5iasp/article/details/23267609

    其中py中application中为数组形式,可以加多条映射,返回结果可以返回渲染后模板也可以返回字符串,例如:

    import tornado.ioloop
    import tornado.web
    import ctypes
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            ip = self.get_argument('ip')
            print(ip)
            self.write("成功")
            self.finish()
    
    class IndexHandler(tornado.web.RequestHandler):
        def get(self):
            items = []
            self.render("ip.html", title="My title", items=items)
    
    application = tornado.web.Application([(r"/index/get", MainHandler),(r"/index", IndexHandler) ])
    
    if __name__ == "__main__":
        # 最小化程序
        ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 6)
        application.listen(9870)
        tornado.ioloop.IOLoop.instance().start()