一、http
关于HTTP协议:
-
浏览器往服务器发的叫 请求(
request
)请求的消息格式: 请求方法 路径:HTTP/1.1\r\n K1:V1\r\n K1:V1\r\n \r\n 请求数据
-
服务端往浏览器发的叫 响应(
response
)响应的消息格式: HTTP/1.1 状态码 状态描述符\r\n K1:V1\r\n K1:V1\r\n \r\n 响应正文(HTML文件)
二、动态网页:
- 本质上都是字符串的替换
- 字符串替换发生在服务端
三、web本质:
-
socket服务端与浏览器的通讯
-
socket服务端和功能划分
a、负责与浏览器收发消息(socket通信 可用第三方模块:wsgiref/uWsgi/gunicorn...) b、根据用户返回不同的路径执行不同的函数 c、从HTML读取出内容,并且完成字符串的替换 (可用第三方模块:jinja2)
-
一个完整的请求流程:
0.启动服务器端,等待客户端(用户的浏览器)来连接 1.在浏览器地址栏输入URL,与服务器端建立链接,浏览器发送请求 2.服务端收到请求消息,解析请求消息,根据函数和路径的对应关系,找到将要执行的函数 3.执行函数,打开HTML文件,进行字符串替换,得到一个最终要返回的HTML内容 4.按照HTTP协议的消息格式要求,把HTML内容回复给用户浏览器(发送响应) 5.浏览器收到响应消息之后,按照HTML的规则渲染页面 6.关闭连接
四、python中web框架的分类
-
按上面三个功能划分:
1、框架自带a,b,c:Tornado 2、框架自带b和c,使用第三方的a:Django 3、框架自带b,使用第三方的a和c:flask
-
按另一个维度划分:
1、Django:大而全(你做一个网站能用到的它都有) 2、其他:flask(轻量级)
五、根据用户返回不同的路径执行不同的内容示例:
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",8080))
sk.listen(5)
while True:
conn,addr = sk.accept()
data = conn.recv(1024)
# 把收到的数据转成字符串类型
data_str = str(data,encoding="utf-8") #bytes("xxxxx",encoding="utf-8")(把字符串转成bytes类型)
#用\r\n切割上面字符串
s1 = data_str.split("\r\n")
#用\r\n切割上面字符串
s2 = s1[0].split()
url = s2[1]
conn.send(b'http/1.1 200 OK\r\ncontent-type:text/html; charset=utf8\r\n\r\n')
# 不同的url返回不同的内容
if url == "/li/":
conn.send(b'hello li!')
elif url == "/long/":
conn.send(b'hello long')
else:
conn.send(b'not find')
conn.close()
sk.close()
回应:b’GET / HTTP/1.1\r\n
Host: 127.0.0.1:8080\r\n
Connection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8\r\nAccept-Encoding: gzip, deflate, br\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n\r\n’