一,

web框架全名web应用框架
web开发 html css js
web应用
类似socket
客户端是浏览器
web应用作用接受socket请求 处理 响应数据字符串

二,

浏览器端发送的是报文,就是一堆字符串,包括地址,请求类型等
响应的字符有固定格式:响应首行+响应体用两个\r\n隔开
HTTP/1.1 200 ok\r\n\r\nhelloworld

import socket
soc=socket.socket()
soc.bind(127.0.0.1,  8800)
soc.listen()

while True:
  conn,addr=soc.accept()
  data=conn.recv(1024)
  conn.send(b"helloworld")
  conn.close()
上面的方式发出去浏览器解析不了,提示“收到的响应无法解析”因为根据http协议浏览器不认识helloworld所以要按前面的那个发

三,

如果响应的是<h1>helloworld</h1>
在浏览器端审查,network-request,preview,response
response可以看到响应的字符串,preview看到的是浏览器渲染后的标签
可以把标签放到html中,服务器读取出来发给浏览器就可以了

四,请求:

1,请求首行:方法(get/post),URI(/form/entity), 协议版本HTTP/1.1
get一般做查询操作,没有请求体,数据放在url后面以?分隔开,post一般做数据库更新操作,有请求体
2,请求头:包括若干键值对,是这次请求的信息,比如host表示请求的主机名,connection:(keep-alive表示这次请求后过3000ms再断开连接,close表示请求后立马断开),content-type表示请求的数据类型,content-length表示本次请求发送的字节数
3,请求体:get请求没有请求体,数据是放在URL后面以?分隔开,最后在接收端收到的URI里面,get请求数据有大小限制,post请求才有请求体,数据大小没有限制。get请求与post请求不同点有三:数据放的地方;数据大小;服务器端获取数据的方式。
4,服务器端怎样区分请求首行,请求头,请求体。服务器端接收的报文里,遇到第一个\r\n的前面是请求首行,后面的每个\r\n分割的是请求头的键值对,直到遇到\r\n\r\n后面就是请求体

请求首行必须要有,请求头可加可不加,反正浏览器已经封装了。请求体不是每次请求都有
数据库的查询一般用get 增删改一般用post
响应:
跟请求差不多,包括响应首行,响应头,响应体,也是/r/n  /r/n/r/n来分隔
响应首行:HTTP/1.1 200 ok 协议版本 状态码 状态码说明。2xx表示成功,3xx表示重定向,4xx表示资源未找到,5xx表示服务器代码运行出错,1xx表示请求正在处理。重定向理解:比如某网站域名由A.com变成了A1.com,如果有浏览器访问域名A.com,服务器会给它响应一个重定向状态码3xx,让浏览器重新发请求到A1.com,这个过程就叫重定向。重定向对浏览器来说相当于发了两次请求
响应头:date 时间 content-length:长度  content-type:格式
响应体:发给浏览器需要渲染到页面的内容 

 六,

URL:协议://IP:端口/路径?a=1
根据路径不同返回不同的页面
wsgiref模块,作用是解析请求数据,把字符串按http协议解析成字典,或者按http协议把数据封装成浏览器能识别的字符串

wsgiref用法:
from wsgiref.simple_server import make_server
def application(environ, start_response):
   #请求路径。请求的参数封装在这里面
   path=environ.get("PATH_INFO")
   #给响应添加响应首行和响应头
   #响应头[("content-type","xml")]
   start_response('200  ok', [])
   #给响应添加响应体用return
   return  [b'<h1>hello web</h1>']
   
# 封装server
httpd=make_server("", "8080",application)
# 开始监听请求
httpd.serve_forever()

 七,

之前看到的发送第一个请求的时候,会附加发送一个/favicon.ico的get请求,这个是干什么的呢?这个是网站标题的icon图标。而且返回的内容跟第一次请求返回的内容一样。那页面的内容是哪一次返回的内容呢,这样不会覆盖吗?答案应该是第一次请求的内容,因为favicon.ico的请求是浏览器自动发的,为了获取到标题栏的图标,而且该请求的请求头中有个字典,accept:image/webp image/apng...指的是本次请求期望得到一个图片。服务器端要以rb方式打开图片发过去就行了   
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄