HTTP
请求协议详情
-请求首行---》请求方式,请求地址,请求协议版本
-请求头---》key:value形式
-referer:上一次访问的地址
-user-agenet:客户端类型
-name:lqz
-cookie:只要是当前域【https://www.cnblogs.com/】中有的cookie,当次请求就会携带
-请求体:get请求一般没有请求体
响应协议详情
-响应首行:响应协议版本,响应状态码,响应描述
-响应头:key-value形式 cookie带在响应头中---》浏览器会把它存到浏览器的cookie中
-响应体:浏览器页面中看到的东西 ---》html标签
补充:
post 既能带在地址栏中数据,又能带在请求体中数据
get请求一般都带在地址栏中
补充:
-请求一个网址:
https://www.cnblogs.com/liuqingzheng/articles
域名(https://www.cnblogs.com)+路径(liuqingzheng/articles)
-携带数据到后端:有哪几种方式?
1 带在地址栏中 域名+路径+参数
https://www.cnblogs.com/liuqingzheng/articles?name=xx&age=111
django从:requets.GET request.get_full_path
2 带在请求体中---》http的请求体--》多种编码格式
-json:后期会使用它多
-urlencoded:form表单,默认
-form-data:传文件
django从:request.POST request.body
3 带在请求头中
django中哪里取 request.META--->取出请求头
-服务端响应给客户端数据
-响应头中
-用的最多:响应体
$.ajax({
path:/login/?name=lqz,
data:{}
})----->写成这样---》最终它会变成一个http请求,写的path实际是请求路径,写的data就是请求体
HTTP 请求响应流程
HTTP 协议的请求响应流程如下图所示:
客户端向服务器发送请求
当我们在浏览器地址栏中输入网址时,浏览器会向服务器发送 HTTP 请求,请求文本格式如下:
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1
其中,第一行请求行包括请求方法、请求 URL 和 HTTP 协议版本信息;第二行起的若干行为请求头(Header),用于告知服务器一些额外的信息,如客户端类型、支持的内容格式、是否支持压缩等。如上面的例子中,请求方法为 GET,请求 URL 为 /index.html,HTTP 版本为 1.1。
服务器处理请求
当服务器接收到客户端请求后,会按照一定的算法进行处理,生成请求的资源,并将其封装在一个 HTTP 响应报文中返回给客户端。响应报文分为首部和主体两部分,其中首部用于描述响应的各种属性信息,包括响应码、内容类型、过期时间、缓存控制等信息;主体则是响应的实体内容。响应文本格式如下所示:
HTTP/1.0 200 OK Content-Type: text/html; charset=UTF-8 Content-Encoding: gzip Content-Length: 1234 (Number of bytes in the response body) Connection: close // 表示连接关闭<!DOCTYPE html> <html> <head><title>Example Website</title> </head> <body><h1>Welcome to Example Website!</h1><p>This is an example website created for demonstration purposes.</p> </body> </html>
其中,第一行为状态行,指定了 HTTP 响应状态码(200 表示成功)和对应的状态信息(OK);第二行起的若干行为响应头,包括内容类型、内容编码、长度和连接方式等;最后是响应主体,即服务器返回的实体内容。
HTTP 报文结构
HTTP 报文分为请求报文和响应报文两种类型,它们的格式如下所示:
请求报文格式
Request-Line (headers) CRLF [message-body]
其中,Request-Line 包括请求方法、请求 URL 和 HTTP 协议版本;headers 为若干个头部信息;CRLF 表示换行符;message-body 为可选项,用于存放请求主体内容。
例如,以下是一个请求报文示例:
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive Upgrade-Insecure-Requests: 1name=John&age=30
响应报文格式
Status-Line
(headers)
CRLF
[message-body]
其中,Status-Line 包括 HTTP 状态码和状态信息;headers 为若干个头部信息;CRLF 表示换行符;message-body 为可选项,用于存放响应主体内容。
例如,以下是一个响应报文示例:
HTTP/1.0 200 OK
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Content-Length: 1234 (Number of bytes in the response body)
Connection: close // 表示连接关闭<!DOCTYPE html>
<html>
<head><title>Example Website</title>
</head>
<body><h1>Welcome to Example Website!</h1><p>This is an example website created for demonstration purposes.</p>
</body>
</html>
Web框架
1 web 框架是什么
Web框架(Web framework)是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。浏览器和服务器的是基于HTTP协议进行通信的。也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率
2 python界有个协议 wsgi协议
客户端浏览器和 ----------------------> python web框架之间通信需要遵循这个协议 发出来的是http请求 符合wsgi协议的web服务器 django,flask requset response
基于这个协议的web服务器:
-wsgiref:django框架默认就用它---》性能低,并发量低--》测试阶段使用
-uwsgi:c语言写的
-gunicorn:python写的
协议到底怎么规定的:web服务器后面的 python框架一定是一个可调用的对象,必须接收两个参数(environ, start_response)--->environ它是个字典----》里面全是http请求的东西
3 使用wsgiref写个web服务
from wsgiref.simple_server import make_serverdef mya(environ, start_response):print(environ)start_response('200 OK', [('Content-Type', 'text/html')])if environ.get('PATH_INFO') == '/index':with open('index.html','rb') as f:data=f.read()elif environ.get('PATH_INFO') == '/login':with open('login.html', 'rb') as f:data = f.read()else:data=b'<h1>Hello, web!</h1>'return [data]# 可调用对象---》能加括号执行的对象if __name__ == '__main__':myserver = make_server('', 8011, mya) # 请求来了---》经过wsgiref---》调用后面的可调用对象--》传入两个参数(environ, start_response)print('监听8011')myserver.serve_forever()