zoukankan      html  css  js  c++  java
  • WSGI原理

    web_server:

     1 import socket
     2 import time
     3 import multiprocessing
     4 import re
     5 import mini_frame
     6 
     7 class WSGIServer(object):
     8     def __init__(self):
     9         # 1.创建socket对象
    10         self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    11         # 2.设置重复使用地址
    12         self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    13         # 3.绑定端口
    14         self.tcp_server_socket.bind(("", 7890))
    15         # 4.设置监听状态
    16         self.tcp_server_socket.listen(128)
    17     
    18     def clinet_server(self,new_client_socket):
    19         # 1.接受消息
    20         request = new_client_socket.recv(1024).decode("utf-8")
    21         lines = request.splitlines()
    22         # 2.匹配请求网页
    23         request_name = re.match(r"[^/]+(/[^ ]*)",lines[0])
    24         file_name = request_name.group(1)
    25         if file_name == "/":
    26             file_name = "/index.html"
    27 
    28         # 返回数据给浏览器
    29         if not file_name.endswith(".py"):
    30             # 3.打开文件
    31             try:
    32                 f = open("./html" + file_name,"rb")
    33             except Exception as ret:
    34                 pass
    35             else:
    36                 html_content = f.read()
    37 
    38                 # 4.创建header和body
    39                 response_body = html_content
    40                 response_header = "HTTP/1.1 200 ok
    "
    41                 response_header += "Content-Length:%d
    " % len(response_body)
    42                 response_header += "
    "
    43                 response = response_header.encode("utf-8") + response_body
    44                 # 5.发送
    45                 new_client_socket.send(response)
    46             finally:
    47                 f.close()
    48         else:
    49             # 如果是.py结尾,则认为是动态页面请求/
    50             env = dict();
    51             env['PATH_INFO'] = file_name
    52             # application(字典, 方法名) 固定用法
    53             body = mini_frame.application(env, self.start_respones_header)
    54             # 拼装header头
    55             header = "HTTP/1.1 %s
    " % self.status
    56             for temp in self.headers:
    57                 header += "%s:%s
    " % (temp[0], temp[1])
    58             header += "
    "
    59             # 拼装返回数据
    60             response = header + body
    61             # 发送数据
    62             new_client_socket.send(response.encode("utf-8"))
    63 
    64         # 6.关闭socket
    65         # new_client_socket.close()
    66 
    67     def start_respones_header(self, status, headers):
    68         """接受并保存application传过来的值"""
    69         self.status = status
    70         self.headers = [("server","mini_web v1.0")]
    71         self.headers += headers
    72     
    73     
    74     def run_forever(self):
    75         """运行"""
    76         while True:
    77             # 5.接收客户地址,创建新socket
    78             new_client_socket,client_addr = self.tcp_server_socket.accept()
    79             # 6.为新客户端服务
    80             p = multiprocessing.Process(target=self.clinet_server,args=(new_client_socket,))
    81             p.start()
    82             # 7.关闭新客户端
    83             new_client_socket.close()
    84         # 7.关闭socket
    85         self.tcp_server_socket.close()
    86 
    87 def main():
    88     wsgi_server = WSGIServer()
    89     wsgi_server.run_forever()
    90 
    91 if __name__ == '__main__':
    92     main()

    mini_frame.py:

     1 def login():
     2     """模拟登陆页面"""
     3     return "---login---welcome to python--->time:%s" % time.ctime()
     4 
     5 def index():
     6     """模拟主页"""
     7     return "----index----"
     8 
     9 def application(env, start_respones):
    10     # 调用传过来的方法,传值
    11     start_respones('200 ok',[("Content-Type","text/html;charset=utf-8")])
    12     # 接受字典传过来的数据
    13     file_name = env['PATH_INFO']
    14     # 判断客户请求
    15     if file_name == "/index.py":
    16         return index()
    17     elif file_name == "/login.py":
    18         return login()
    19     else:
    20         return "python 中国"
  • 相关阅读:
    失眠食療
    学会妥协学会弯腰(下册)
    软件工程(第4版·修订版)
    GitHub入门与实践
    iOS开发:从零基础到精通
    Premiere Pro CS6高手成长之路
    网页设计与前端开发从入门到精通Dreamweaver+Flash+Photoshop+HTML+CSS+JavaScript
    CINEMA 4D R17 完全学习手册(第2版)
    1040. 二叉树层次遍历
    1041. 二哥打飞机
  • 原文地址:https://www.cnblogs.com/yifengs/p/11460335.html
Copyright © 2011-2022 走看看