• 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! 我爱你中国....'
  • 相关阅读:
    Fabric简介
    推荐一个在线Markdown编写网站,可转化PDF,DOC格式
    7-独立事件和互不相容(概率论与数理统计学习笔记)
    6- 全概率公式/贝叶斯公式(概率论与数理统计学习笔记)
    5-条件概率/乘法公式(概率论与数理统计学习笔记)
    4-几何概型/频率/公理化(概率论与数理统计学习笔记)
    3-古典概率与排列组合(概率论与数理统计学习笔记)
    PLS-00306: 调用 'SYNCRN' 时参数个数或类型错误
    C# MongoDB 查询,分组,聚合,排序,条件,分页
    MVC + Vue.js 初体验(实现表单操作)
  • 原文地址:https://www.cnblogs.com/fromlantianwei/p/10109228.html
Copyright © 2020-2023  润新知