zoukankan      html  css  js  c++  java
  • 18 12 `12 WSGI 协议

    所谓wsig 协议  就是把web框架 和服务器进行分开  然后通过 wisg协议 进行连接  这样子可以随时替换web框架  或者 更换服务器 解耦 (现在学的内容里 静态连接一般是放在服务器里  而动态连接是放在web框架  不知道这句有没有错)

    举个例子

    下面是一个服务器 通过wsig 与web框架进行连接

    import socket
    import re
    import multiprocessing
    import time
    import mini_frame
    
    
    class WSGIServer(object):
        def __init__(self):
            # 1. 创建套接字
            self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
            # 2. 绑定
            self.tcp_server_socket.bind(("", 7890))
    
            # 3. 变为监听套接字
            self.tcp_server_socket.listen(128)
    
        def service_client(self, new_socket):
            """为这个客户端返回数据"""
    
            # 1. 接收浏览器发送过来的请求 ,即http请求  
            # GET / HTTP/1.1
            # .....
            request = new_socket.recv(1024).decode("utf-8")
            # print(">>>"*50)
            # print(request)
    
            request_lines = request.splitlines()
            print("")
            print(">"*20)
            print(request_lines)
    
            # GET /index.html HTTP/1.1
            # get post put del
            file_name = ""
            ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
            if ret:
                file_name = ret.group(1)
                # print("*"*50, file_name)
                if file_name == "/":
                    file_name = "/index.html"
    
            # 2. 返回http格式的数据,给浏览器
            # 2.1 如果请求的资源不是以.py结尾,那么就认为是静态资源(html/css/js/png,jpg等)
            if not file_name.endswith(".py"):
                try:
                    f = open("./html" + file_name, "rb")
                except:
                    response = "HTTP/1.1 404 NOT FOUND
    "
                    response += "
    "
                    response += "------file not found-----"
                    new_socket.send(response.encode("utf-8"))
                else:
                    html_content = f.read()
                    f.close()
                    # 2.1 准备发送给浏览器的数据---header
                    response = "HTTP/1.1 200 OK
    "
                    response += "
    "
                    # 2.2 准备发送给浏览器的数据---boy
                    # response += "hahahhah"
    
                    # 将response header发送给浏览器
                    new_socket.send(response.encode("utf-8"))
                    # 将response body发送给浏览器
                    new_socket.send(html_content)
            else:
                # 2.2 如果是以.py结尾,那么就认为是动态资源的请求
    
                env = dict()  # 这个字典中存放的是web服务器要传递给 web框架的数据信息
                env['PATH_INFO'] = file_name
                # {"PATH_INFO": "/index.py"}
                body = mini_frame.application(env, self.set_response_header)
    
                header = "HTTP/1.1 %s
    " % self.status
    
                for temp in self.headers:
                    header += "%s:%s
    " % (temp[0], temp[1])
    
                header += "
    "
    
                response = header+body
                # 发送response给浏览器
                new_socket.send(response.encode("utf-8"))
    
    
            # 关闭套接
            new_socket.close()
    
        def set_response_header(self, status, headers):
            self.status = status
            self.headers = [("server", "mini_web v8.8")]
            self.headers += headers
            
    
        def run_forever(self):
            """用来完成整体的控制"""
    
            while True:
                # 4. 等待新客户端的链接
                new_socket, client_addr = self.tcp_server_socket.accept()
    
                # 5. 为这个客户端服务
                p = multiprocessing.Process(target=self.service_client, args=(new_socket,))
                p.start()
    
                new_socket.close()
    
    
            # 关闭监听套接字
            self.tcp_server_socket.close()
    
    
    def main():
        """控制整体,创建一个web 服务器对象,然后调用这个对象的run_forever方法运行"""
        wsgi_server = WSGIServer()
        wsgi_server.run_forever()
    
    
    if __name__ == "__main__":
        main()

    下面是通过

    def index():
        return "这是主页"
    
    def login():
        return "这是登录页面"
    
    def application(env, start_response):
        start_response('200 OK', [('Content-Type', 'text/html;charset=utf-8')])
        
        file_name = env['PATH_INFO']
        # file_name = "/index.py"
    
        if file_name == "/index.py":
            return index()
        elif file_name == "/login.py":
            return login()
        else:
            return 'Hello World! 我爱你中国....'
  • 相关阅读:
    Codeforces-541div2
    动态规划-线性dp-hdu-4055
    动态规划_线性dp
    动态规划_背包问题笔记
    codeforces-1111
    数论模板
    codeforces-1114F-线段树练习
    2-sat
    拓扑排序
    强连通分量
  • 原文地址:https://www.cnblogs.com/fromlantianwei/p/10109228.html
Copyright © 2011-2022 走看看