zoukankan      html  css  js  c++  java
  • 第二十四节 让web服务器支持WSGI协议

    import socket
    import multiprocessing
    import re
    # import dynamic.mini_frame
    import sys
    # 通过sys.argv在cmd命令行给实例对象传参
    
    class WSGIServer():
    
        def __init__(self, port, app, static_path):
            self.application = app
            self.static_path = static_path
            self.web_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.web_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self.web_socket.bind(('192.168.1.7',int(port)))
            self.web_socket.listen(128)
    
        def tcp_serve(self, resp_socket):
            recv_data = resp_socket.recv(1024).decode('utf-8')
            request_lines = recv_data.splitlines()
            file_name = ''
            ret = re.match(r"[^/]+(/[^ ]*)",request_lines[0])
            if ret:
                file_name=ret.group(1)
                if file_name == "/":
                    file_name = 'index.html'
    
            path = self.static_path + file_name
            if not file_name.endswith(".py"):
                # 判断是都是.py结尾,不是返回动态页面,是返回静态页面
                try:
                    f=open(path,'rb')
                except:
                    resp_data = 'HTTP/1.1 200 OK
    ' + "
    " + '.....file not find....'
                    resp_socket.send(resp_data.encode('utf-8'))
                else:
                    html_content = f.read()
                    f.close()
                    resp_data = 'HTTP/1.1 200 OK
    ' + "
    "
                    resp_socket.send(resp_data.encode('utf-8'))
                    resp_socket.send(html_content)
            else:
                # 动态页面处理
                env= dict()
                env['PATH INFO'] = file_name
                # 调用mini_frame框架里的application函数,返回header和body,在将两者在web服务器里组装,返回给浏览器
                body =self.application(env, self.set_response_headers)
                header = 'HTTP/1.1 %s
    ' % self.status
                for temp in self.headers:
                    header += "%s:%s
    " % (temp[0], temp[1])
                header += "
    "
                resp_data = header +body
                resp_socket.send(resp_data.encode('utf-8'))
    
            resp_socket.close()
    
        def set_response_headers(self,status,headers):
            '''该方法用于接收mini_frame框架里返回的header数据'''
            self.status = status
            self.headers = [('Server','mini_web v8.8')]
            self.headers += headers
    
        def run_forver(self):
            while True:
                resp_socket, resp_addr = self.web_socket.accept()
                p = multiprocessing.Process(target=self.tcp_serve, args=(resp_socket,))
                p.start()
                # 同乌班图一样也需要关闭套接字,跟文件描述符有关,不然页面一直刷新不出来
                resp_socket.close()
            # self.web_socket.close()
    
    def main():
        if len(sys.argv) == 3:
            try:
                port = int(sys.argv[1])
                frame_app_name = sys.argv[2]
            except Exception as ret:
                print('端口输入有误....')
                return
        else:
            print('请按以下方式运行:')
            print('python xxx.py 7890 mini_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('python xxx.py 7890 mini_frame:application')
            print("...........................")
            return
        # 打开配置文件,进行路径读入
        with open('web_server.conf') as fd:
            conf_info = eval(fd.read())
        '''{
        "static_path":"E:\360Downloads\Software\新建文件夹\新建文件夹\tmag_23_Infinity",
        "dynamic_path":"./dynamic"
            }'''
    
        # sys.path 返回的是一个列表!该路径已经添加到系统的环境变量了,当我们要添加自己的搜索目录时,可以通过列表的append()方法
        # 对于模块和自己写的脚本不在同一个目录下,在脚本开头加sys.path.append('xxx'):
        sys.path.append(conf_info['dynamic_path'])
        # 直接用import frame_name 不会将frame_name 认为是一个变量,直接认为是一个模块名
        frame = __import__(frame_name)
        app = getattr(frame, app_name)
    
        wsgi_server = WSGIServer(port, app, conf_info["static_path"])
        wsgi_server.run_forver()
    
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    C#变量初始化
    Mcrosoft中间语言的主要特征
    去除json数据的某些键值对
    ASP.NET MVC 之控制器与视图之间的数据传递
    ASP.NET MVC 路由进阶(之二)--自定义路由约束
    ASP.NET WEB API 初探
    Linux学习三部曲(之三)
    Linux学习三部曲(之二)
    Linux学习三部曲(之一)
    C# 3.0 特性之扩展方法
  • 原文地址:https://www.cnblogs.com/kogmaw/p/12602541.html
Copyright © 2011-2022 走看看