Python知识锦集

Python mini-web框架1:WSGI-mini-web

2019-01-01  本文已影响4人  IIronMan

总体内容

一、多进程-web服务器面向对象web服务器,返回的是静态界面

import socket
import multiprocessing
import re


class WSGIServer(object):

     def __init__(self):=
          """用来完成整体的控制"""
          # 1.创建套接字
          self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
          # 2.绑定
          self.tcp_server_socket.bind(("192.168.3.6", 7790))
          # 3.变为监听套接字
          self.tcp_server_socket.listen(128)

     def server_client(self,new_socket):
          """为这个客户端返回数据"""
          # # 组织相应 头信息(header)
          # 1.接收浏览器发送过来的请求,即 http请求
          # GET / HTTP/1.1
          # ....
          request = new_socket.recv(1024).decode("utf-8")
          # print(request)

          request_lines = request.splitlines()
          print("")
          print(">"*20)
          print(request_lines)
          print("<" * 20)

          # 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("file_name=%s" % file_name)

             print("*"*50,file_name)
             if file_name == "/":
                  file_name = "/index.html"

          # 2.返回http格式的数据,给浏览器
          # 2.1、准备发送给浏览器的数据---header

          try:
               f = open("./html"+file_name,"rb")
          except:
               response = "HTTP/1.1 404 NOT FOUND\r\n"
               response += "\r\n"
               response += "----file not found"
               new_socket.send(response.encode("utf-8"))
          else:

               print("-----------OK------------")

                html_content = f.read()
                f.close()

                response = "HTTP/1.1 200 OK\r\n"  # 200表示找到这个资源
                response += "\r\n"  # 用一个空的行与body进行隔开
           # 2.2、准备发送给浏览器的数据 ---body
           # 将response的header发送给浏览器
           new_socket.send(response.encode("utf-8"))
           # 将response的 body 发送给浏览器
           new_socket.send(html_content)

           # 3.关闭套接字
           new_socket.close()


      def run_server(self):

           while True:
                # 4.等待客户端的链接
                new_socket, client_addr = self.tcp_server_socket.accept()

                # 5.开辟一个进程为这个客户端服务
                p = multiprocessing.Process(target=self.server_client,args=(new_socket,))
                p.start()

                new_socket.close()


           # 6.关闭监听的套接字
           tcp_server_socket.close()


def main():
     wsgi_server = WSGIServer()
     wsgi_server.run_server()


if __name__ == '__main__':
      main()

二、静态资源、动态资源、web服务器支持动态解析,返回的是动态界面,也就是在上面的server_client代码中加一个判断,我们以请求的是 .py结尾 来判断是是动态页面请求

def server_client(self,new_socket):
     """为这个客户端返回数据"""
     # # 组织相应 头信息(header)
     # 1.接收浏览器发送过来的请求,即 http请求
     # GET / HTTP/1.1
     # ....
     request = new_socket.recv(1024).decode("utf-8")
     # print(request)

     request_lines = request.splitlines()
     print("")
     print(">"*20)
     print(request_lines)
     print("<" * 20)

     # 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("file_name=%s" % file_name)

         print("*"*50,file_name)
         if file_name == "/":
             file_name = "/index.html"

     # 2.返回http格式的数据,给浏览器
     # 2.1、准备发送给浏览器的数据---header

     if not file_name.endswith(".py"):

        try:
            f = open("./html"+file_name,"rb")
        except:
            response = "HTTP/1.1 404 NOT FOUND\r\n"
            response += "\r\n"
            response += "----file not found"
            new_socket.send(response.encode("utf-8"))
        else:

            print("-----------OK------------")

            html_content = f.read()
            f.close()

            response = "HTTP/1.1 200 OK\r\n"  # 200表示找到这个资源
            response += "\r\n"  # 用一个空的行与body进行隔开
            # 2.2、准备发送给浏览器的数据 ---body
            # 将response的header发送给浏览器
            new_socket.send(response.encode("utf-8"))
            # 将response的 body 发送给浏览器
            new_socket.send(html_content)
     else:

        # 2.2 如果是以 .py 结尾请求就认为是动态资源请求
        header = "HTTP/1.1 200 OK\r\n"  # 200表示找到这个资源
        header += "\r\n"  # 用一个空的行与body进行隔开

        body = "HHHHH"

        response = header + body

        # 准备发送给浏览器的数据 ---body
        # 将response发送给浏览器
        new_socket.send(response.encode("utf-8"))

    # 3.关闭套接字
    new_socket.close()

三、实现很简单的框架,让web服务器支持
提示:也就是写一个共用模块,把请求的数据传到这个模块,然后再模块内进行分析,返回相应的数据,我们把这个模块定义为 mini_frame ,模块内的代码如下

import time


def login():
      return "welcome to our login ......time:%s"% time.ctime()


def register():
      return "welcome to our register ......time:%s"% time.ctime()


def application(file_name):

      if file_name == "/login.py":
             return login()
      elif file_name == "/register.py":
             return  register()
      else:
             return "not found you page..."

把之前 def server_client 里面判断是 .py 结尾的代码里面的body改为如下代码

body = mini_frame.application(file_name)

四、模仿WSGI协议来做一个web服务器的框架

五、通过给web服务器传字典实现浏览器请求的资源不一样,响应的不一样

六、给程序传递参数、添加web服务器的配置文件、添加shell功能

上一篇 下一篇

猜你喜欢

热点阅读