web框架本质

HTTP:

  无状态、短连接(connect--请求--响应--断开)

TCP:

  不断开

WEB应用:

  浏览器(socket客户端,直接使用chrome、ie等)

    2.访问网站ip+端口

      sk.socket()

      sk.connect((ip+端口))

      sk.send('hello')

    5.接收到‘wellcome’

    6.连接断开

 

  网站(socket服务端,需要我们写代码)

      1.监听自己的IP+端口

      while True:

        #等待用户连接

        3.收到'hello'

        4.响应‘wellcome’

        用户断开

 

服务端最本质代码1.0

import socket

sock = socket.socket()

sock.bind(('127.0.0.1', 8080))

sock.listen(5)

 

while True:

  conn,addr = sock.accetp()  # hang住:阻塞等待连接

  #获取用户发送的数据

  data = conn.recv(8096)

  conn.send(b'wellcome123')

  conn.close()

 

升级,按照HTTP协议规则 1.1

HTTP协议:

  发送request:

    1. request headers:

      GET(POST) /index?p=123 HTTP/1.1  # 用\r\n分割

      Host: 127.0.0.1:8000

      Connection: keep-alive

      ......................

    2.request body:  #  请求头和请求体用两个/r/n分割

      如果发送POST请求,那数据会放在请求体中。

      P=123

 

  响应:

    1.response headers响应头

      HTTP/1.1 200 OK

      Set-Cookie: SessionID=13242342342

      ............

    2.response body响应体

      网站返回给访问者的页面内容(浏览器把返回的字符串解析):<html>.........</html>

 

继续升级,返回动态页面

 

while True:

  conn,addr = sock.accetp()  # hang住:阻塞等待连接

  #获取用户发送的数据

  data = conn.recv(8096)

  data = str(data, encoding='utf-8')

  # 得到请求头和请求体

  headers, bodys = data.split('\r\n\r\n')  

   # 得到请求头里的数  

  # GET  /index  HTTP/1.1

  # Host: 127.0.0.1:8000

  temp_list = headers.split('\r\n')  

  #分割请求头第一行,得到方法,url等

  #方法 GET,  URL /index, HTTP/1.1  

  method,url,protocal = temp_list[0].split('  ')

  #按http协议返回response headers

  conn.send(b'HTTP/1.1 200 OK\r\n\r\n')

  # 根据URL匹配路由

  if url == '/index':

    #如果匹配到路由,返回指定的页面,实现动态返回

    conn.send(b'.......123')

  else:

    #如果没有匹配到路由返回404页面

    conn.send(b'404 not found')

  conn.close()

 

继续升级,根据路由调用函数并根据用户请求数据在函数中进行逻辑处理,返回动态页面。(已经近似django的处理)

 

def f1(request):

  return b'f1'

 

def f2(request):

  return b'f2'

 

routers = [

  ('/xxx', f1),

  ('/ooo', f2),

]

 

def run():

  sock = socket.socket()

  sock.bind(('127.0.0.1', 8080))

  sock.listen(5)

  while True:

    conn,addr = sock.accetp()  # hang住:阻塞等待连接

    #获取用户发送的数据

    data = conn.recv(8096)

    data = str(data, encoding='utf-8')

    # 得到请求头和请求体

    headers, bodys = data.split('\r\n\r\n')  

     # 得到请求头里的数  

    # GET  /index  HTTP/1.1

    # Host: 127.0.0.1:8000

    temp_list = headers.split('\r\n')  

    #分割请求头第一行,得到方法,url等

    #方法 GET,  URL /index, HTTP/1.1  

    method,url,protocal = temp_list[0].split('  ')

    #按http协议返回response headers

    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')

    # 遍历routers,进行路由匹配

    func_name = None

    for item in routers:

      if item[0] = url:

        func_name = item[1]

        break

    if func_name:

      response = func_name()

    else:

      response = '404 not found'

    

    conn.send(response)

    conn.close()

 

 

if __name__ == '__main__':

  run()   

 

上一篇:03Python网络编程系列之服务端


下一篇:继程序员奶爸用树莓派自制AI婴儿监视器后,网友实现远程监控