1.Django(web框架本质、http协议)
web项目的流程非常简单:浏览器(scoket客户端)发送请求发送到服务端,服务端接收到这个请求,进行验证,成功之后,响应一个html页面。
什么叫web框架?
假如你想装修⼀个别墅:没有框架:全部由你⼀个⼈去做:买地,打地基,买钢材,混凝⼟,搭建,最终形成⼀个别墅⽑坯房,然后在进⾏装修。如果有框架:直接到⼿⼀个精装修的房⼦,你只需添加⼀些软装,上⼀些家具,就可以⼊住了。
web框架:将客户端与服务端的通信所有的细枝末节以及常用功能都给你封装好了,不用你自己在写了,你只需要在web框架的基础上,写一些配置,业务逻辑的代码即可。
自己构建一个简单版本的web框架
-
web服务端
import socket
server = socket.socket()
server.bind(('127.0.0.1',8000))
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'))
conn.send('<h1>Hello world</h1>'.encode('utf-8'))
conn.close()浏览器与服务器之间要想完成通信必须遵循一个协议(http、https),我们要想研究浏览器与服务器之间的通信肯定绕不开这个协议,所以我们先要研究http协议。
http协议
定义:
超文本传出协议,HTTP是一个客户端终端(用户)和服务端(网站)请求和响应的遵循的标准(TCP)。
浏览器(爬虫工具)只要是发送http请求的都会发送到服务器上的默认端口80。
http工作原理
1、浏览器与web服务器建立TCP链接。
2、浏览器通过TCP链接向web服务器发送HTTP请求
(请求格式:请求行、请求头部、空行、请求数据)
3、web服务器接收到浏览器发送的http请求,进行验证,验证通过后,回给浏览器一个http响应
(响应格式:状态行、响应头部、空行、响应正文)
4、web服务器断开TCP链接。
5、浏览器通过浏览器内核解析web服务器发送的响应的html内容
请求方法
-
重新构建了一个html页面返回给浏览器
import socket
server = socket.socket()
server.bind(('127.0.0.1',8801))
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">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--⻚⾯宽度⾃适应设备的屏幕宽度-->
<title>Title</title>
</head>
<body>
<div>这是一个简单的HTML文件</div>
</body>
</html> -
研究请求信息
GET / HTTP/1.1 # 请求⾏
# 请求头部
Host: 127.0.0.1:8001
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apn
g,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie:
csrftoken=XA2wHCbRDV4TbgilRk1XgXGzBnHXFMlQ6oOUE6s6BHx18vV8NrtlMyk81PrPhk6M
; sessionid=bb1y61paykd0ashz80fapq9vq1f3ga9a
空⾏
请求数据
面试题
浏览器给服务器发送请求:请求方法有哪些?
列举任意5种请求方法:
get post delete head put trace options 等
-
get vs post
每一种请求方法都有不同的应用场景,那么着重研究post请求与get请求
-
应用
常用的get请求:请求一个新页面、a标签、form表单默认是get请求
常用的post请求:一般用于给服务器提交数据,比如提交用户名、密码
-
区别
-
get请求:
我们更改一下html页面
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--⻚⾯宽度⾃适应设备的屏幕宽度-->
<title>Title</title>
</head>
<body>
<form action="" method="get">
用户名: <input type="text" name="username">
密码: <input type="text" name="password">
<input type="submit">
</form>
</body>
</html>服务端接受的get请求信息:
GET /?username=%E8%91%A3%E4%BC%9F%E5%8D%8E&password=123 HTTP/1.1
Host: 127.0.0.1:8801
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://127.0.0.1:8801/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9我们通过get请求提交数据,所提交的数据会拼接到url后⾯提交到服务端。
-
post请求
我们更改一下html页面
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--⻚⾯宽度⾃适应设备的屏幕宽度-->
<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>分析请求数据:
POST / HTTP/1.1 Host: 127.0.0.1:8801 Connection: keep-alive Content-Length: 49 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://127.0.0.1:8801 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Referer: http://127.0.0.1:8801/ Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 username=%E8%91%A3%E4%BC%9F%E5%8D%8E&password=123 //请求数据
-
get与post请求的区别
get提交的数据会放在URL之后,也就是请求行后面,以?分割URL和传输数据,如EditBook?name=test1&id=123456.(请求头⾥⾯那个content-type做的这种参数形式,后⾯讲) POST⽅法是把提交的数据放在HTTP包的请求体中. get提交的数据大小有限制(因为浏览器对URL的长度有限制),而post方法提交的数据没有限制。
-
-
请求格式
请求格式分为四部分:请求行、请求头部、空行、请求数据
-
URL
GET /index/log HTTP/1.1 Host: 127.0.0.1:8001 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apn g,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: csrftoken=XA2wHCbRDV4TbgilRk1XgXGzBnHXFMlQ6oOUE6s6BHx18vV8NrtlMyk81PrPhk6M ; sessionid=bb1y61paykd0ashz80fapq9vq1f3ga9a
URL是什么?答:统一资源定位符。 例:127.0.0.1:8001/index/log
http://www.taibai.com:80/news/index.html?id=250&page=1 协议 服务器(域名 ip地址)端⼝号 路径 查询 /index/log 路径
-
请求头部
Host: 127.0.0.1:8001 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apn g,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Sec-Fetch-Site: none Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: csrftoken=XA2wHCbRDV4TbgilRk1XgXGzBnHXFMlQ6oOUE6s6BHx18vV8NrtlMyk81PrPhk6M ; sessionid=bb1y61paykd0ashz80fapq9vq1f3ga9a
重要的键值对:
Host: 127.0.0.1:8002------> 主机(IP地址和端⼝) Connection: keep-alive-----> 链接是否保留⼀段时间 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36 ------> ⽤户的浏览器代理 Content-Length: 29 ------> 请求数据的⻓度
响应格式
响应格式:状态行、响应头部、空行、响应正文
面试会问你:状态码 4xx 是什么问题?
1xx 接收到了还没有处理完
3xx 重定向,我给你会的响应你当时看不到,但是要跳转到其他的页面才能看到这个消息。比如登录,登录成功之后,浏览器自动跳转到指定网址
4xx 请求有问题,404:找不到
5xx 服务端出现问题,比如服务端崩了等等
响应正文:就是html文件数据
http协议特点总结
1、基于请求-相应的模式
必须基于TCP协议建立连接之上,有请求才可以给其响应
2、无状态保存
不会做持久化保存你的请求或者响应的数据。使⽤HTTP协议,每当有新的请求发送时,就会有对应的新响应产 ⽣。协议本身并不保留之前⼀切的请求或响应报⽂的信息。这是为了更快地处理⼤量事务,确保协议的可伸缩性,⽽特意把HTTP协议设计成 如此简单的。可是,随着Web的不断发展,因⽆状态⽽导致业务处理变得棘⼿ 的情况增多了。⽐如,⽤户登录到⼀家购物⽹站,即使他跳转到该站的 其他⻚⾯后,也需要能继续保持登录状态。针对这个实例,⽹站为了能 够掌握是谁送出的请求,需要保存⽤户的状态。HTTP/1.1虽然是⽆状态协议,但为了实现期望的保持状态功能, 于是引⼊了Cookie技
3、无连接