2.Django(web框架的 简单版、升级版、函数进阶版、并发进阶版)

简单版web框架

  • socket

    import socket
    server = socket.socket()
    server.bind(('127.0.0.1',8001))
    server.listen(5)

    while 1:
      conn,addr = server.accept()
      from_client_data = conn.recv(1024)
      print(from_client_data.decode('utf-8'))
      # 浏览器与服务器之间的通信要遵循一个协议:http https协议
      conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
      with open('HTML页面.html',mode='rb') as f1:
          conn.send(f1.read())
      conn.close()
  • html页面

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>
      <form action="" method="post">
          ⽤户名:<input type="text" name="username">
          密码:<input type="text" name="password">
          <input type="submit">
      </form>
    </body>
    </html>

     

升级版web框架

我们的html是需要有css、js代码的,上⾯的没有这些内容

浏览器共发起了四次请求:

第⼀次请求,请求的是127.0.0.1:8001/ 根⽬录,服务器给其返回了⼀个html⻚⾯。

第⼆次请求:link主动发起的异步请求,请求127.0.0.1:8001/test2.css 等待服务端响应。

第三次请求:script主动发起的异步请求,请求127.0.0.1:8001/test2.js 服务端响应。

第四次请求:请求的是⽹⻚窗⼝前⾯的⼩图标请求127.0.0.1:8001/favicon.ico服务端响应

由于我们后端的逻辑有问题,你发送了四次请求,我们响应了四次 html⻚⾯。

我们的解决思路:针对不同的请求,返回不同的数据

  • scoket服务端

    import socket

    server = socket.socket()
    server.bind(('127.0.0.1', 8001))
    server.listen(5)
    while 1:
      conn, addr = server.accept()
      from_client_data = conn.recv(1024).decode('utf-8')
      # print(from_client_data)
      path = from_client_data.split('\r\n')[0].split()[1]
      print(path)
      if path == '/':
          conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
          with open('HTML页面.html', mode='rb') as f1:
              conn.send(f1.read())
      elif path == '/test2.css':
          conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
          with open('test2.css', mode='rb') as f1:
              conn.send(f1.read())
      elif path == '/test2.js':
          conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
          with open('test2.js', mode='rb') as f1:
              conn.send(f1.read())
      elif path == '/icon.png':
          conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
          with open('icon.png', mode='rb') as f1:
              conn.send(f1.read())
      conn.close()
  • html页面

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
      <link rel="stylesheet" href="test2.css">
      <link rel="icon" href="icon.png">
    </head>
    <body>
      <div><h1>欢迎来到皇家洗脚城</h1></div>
        荣誉会员:
        <ul>
            <li>王砖家</li>
            <li>⼤鸡哥</li>
            <li>强哥</li>
        </ul>
        <script src="test2.js"></script>
    </body>
    </html>

     

函数进阶版web框架

  • socket

    import socket

    server = socket.socket()
    server.bind(('127.0.0.1', 8001))
    server.listen(5)


    def html(conn):
      with open('升级版.html', mode='rb') as f1:
          conn.send(f1.read())


    def css(conn):
      with open("test3.css", mode='rb') as f1:
          conn.send(f1.read())


    def js(conn):
      with open("test3.js", mode='rb') as f1:
          conn.send(f1.read())


    def icon(conn):
      # 图标只有第⼀次发送请求,当请求过后,再次请求 浏览器给我们缓存了。不会再发送请求了
    with open('icon.png', mode='rb') as f1:
    conn.send(f1.read())

    url_list = [
      ('/', html),
      ('/test3.css', css),
      ('/test3.js', js),
      ('/icon.png', icon),
    ]
    while 1:
    conn, addr = server.accept()
    from_client_data = conn.recv(1024).decode('utf-8')
    path = from_client_data.split('\r\n')[0].split()[1]
    '''
    /
    /test2.css
    /test2.js
    /icon.png
    '''
    conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
    for url_tuple in url_list:
      if url_tuple[0] == path:
          url_tuple[1](conn)
          break
    conn.close()
  • html页面

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
      <link rel="stylesheet" href="test2.css">
      <link rel="icon" href="icon.png">
    </head>
    <body>
      <div><h1>欢迎来到皇家洗脚城</h1></div>
        荣誉会员:
        <ul>
            <li>王砖家</li>
            <li>⼤鸡哥</li>
            <li>强哥</li>
        </ul>
        <script src="test2.js"></script>
    </body>
    </html>

     

并发进阶版web框架

函数进阶是在代码级别提升了,但是还是⼀个⼀个的穿⾏处理请求,第⼀个请求来了,剩下三个请求就等着,等第⼀个请求处理完了,关闭了链接,在处理第⼆个请求。不合理,并且极⼤地影响效率。

  • socket

    import socket
    from threading import Thread

    server = socket.socket()
    server.bind(('127.0.0.1', 8001))
    server.listen(5)


    def html(conn):
      with open('升级版.html', mode='rb') as f1:
          conn.send(f1.read())
          conn.close()


    def css(conn):
      with open("test3.css", mode='rb') as f1:
          conn.send(f1.read())
          conn.close()


    def js(conn):
      with open("test3.js", mode='rb') as f1:
          conn.send(f1.read()
          conn.close()


    def icon(conn):
      with open("test3.js", mode='rb') as f1:
          conn.send(f1.read())
          conn.close()
           
           
    with open('icon.png', mode='rb') as f1:
      conn.send(f1.read())
      url_list = [
          ('/', html),
          ('/test3.css', css),
          ('/test3.js', js),
          ('/icon.png', icon),
      ]
      while 1:
          conn, addr = server.accept()
          from_client_data = conn.recv(1024).decode('utf-8')
          # print(from_client_data)
          path = from_client_data.split('\r\n')[0].split()[1]
          print(path)
          '''
          /
          /test2.css
          /test2.js
          /icon.png
          '''
          conn.send('HTTP/1.1 200 OK \r\n\r\n'.encode('utf-8'))
          for url_tuple in url_list:
              if url_tuple[0] == path:
                  t = Thread(target=url_tuple[1],args=(conn,))
                  t.start()
           
  • html页面

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
      <link rel="stylesheet" href="test2.css">
      <link rel="icon" href="icon.png">
    </head>
    <body>
      <div><h1>欢迎来到皇家洗脚城</h1></div>
        荣誉会员:
        <ul>
            <li>王砖家</li>
            <li>⼤鸡哥</li>
            <li>强哥</li>
        </ul>
        <script src="test2.js"></script>
    </body>
    </html>

    并发异步处理肯定⽐之前的串⾏处理效率⾼

  •  

posted @ 2020-05-19 10:31  牧羊小董  阅读(154)  评论(0)    收藏  举报