HTTP协议与WEB框架、多任务、进程
HTTP协议简介
超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是应用层协议。HTTP是万维网的数据通信的基础。
HTTP协议概述
HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。
HTTP协议工作原理
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP 请求/响应的步骤:
- 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com。 - 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。 - 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。 - 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求; - 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
请求方式
HTTP/1.1 协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:
- GET
向指定的资源发出“显示”请求。使用 GET 方法应该只用在读取数据,而不应当被用于产生“副
作用”的操作中,例如在 Web Application 中。其中一个原因是 GET 可能会被网络蜘蛛等随
意访问。 - HEAD
与 GET 方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文
部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关
于该资源的信息”(元信息或称元数据)。 - POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在
请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。 - PUT
向指定资源位置上传其最新内容。 - DELETE
请求服务器删除 Request-URI 所标识的资源。 - TRACE
回显服务器收到的请求,主要用于测试或诊断。 - OPTIONS
这个方法可使服务器传回该资源所支持的所有 HTTP 请求方法。用’*'来代替资源名称,向
Web 服务器发送 OPTIONS 请求,可以测试服务器功能是否正常运作。 - CONNECT
HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。通常用于 SSL 加密服务器
的链接(经由非加密的 HTTP 代理服务器)。
注意事项:
- 方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,
服务器应当返回状态码 405(Method Not Allowed),当服务器不认识或者不支持对应的请
求方法的时候,应当返回状态码 501(Not Implemented)。 - HTTP 服务器至少应该实现 GET 和 HEAD 方法,其他方法都是可选的。当然,所
有的方法支持的实现都应当匹配下述的方法各自的语义定义。此外,除了上述方法,特定的
HTTP 服务器还能够扩展自定义的方法。例如 PATCH(由 RFC 5789 指定的方法)用于
将局部修改应用到资源。
URL
统一资源定位符,用来确定互联网中的唯一资源;
超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
(1)传送协议。
(2)层级URL标记符号(为[//],固定不变)
(3)访问资源需要的凭证信息(可省略)
(4)服务器。(通常为域名,有时为IP地址)
(5)端口号。(以数字方式表示,若为HTTP的默认值“:80”可省略)
(6)路径。(以“/”字符区别路径中的每一个目录名称)
(7)查询。(GET模式的请求参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
以http://www.baidu.com:80/news/index.html?id=250&page=1 为例, 其中:
http : 是协议;
www.baidu.com: 是服务器(域名);
80:是服务器上的网络端口号;
/news/index.html,是路径;
?id=250&page=1,是查询(携带参数)。
以?区别路径和参数,参数使用键值对方式name=’zs’&age=10,每个键值对使用&符号链接。
HTTP请求格式
回车符 \r 换行符 \n
- 请求首行分析:
- 请求方式: GET 和 POST 方式
GET请求:地址栏访问、超链接访问都是get请求方式,get请求方式不安全,地址栏大小有限。
POST请求:内容在请求体中,数据安全,理论上内容可以无限。 - 请求地址:访问服务器的哪个目录。
- 请求协议: HTTP版本有1.0和1.1两个版本, 1.0版本建立连接后立即断开,下次访 问需要再次建立连接, 1.1版本 建立连接后可以不用断开,直到不发送信息后 才断开节约了资源;
- 请求头分析:
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8;
表示客户端可以接受的内容类型, 多个值使用;分号隔开 q=0.9 表示权重优先级,*/*表示可以接受任意类型内容; - Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 表示客户端可以接受的语言;
- User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64,是客户浏览器的名称;
浏览器信息,例如使用的是网井的内核, windows64位系统; - Accept-Encoding: gzip, deflate–>>支持的压缩格式;
- Host: localhost:8888====>访问地址;
- Connection: keep-alive —>>保持连接 和HTTP1.1版本有关,默认保持3s;keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间,比如当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都去请求建立连接
- Content-Type: application/x-www-form-urlencoded 表单提交时才有可能出现,表示表单的数据类型,使用url编码,url编码 % 16位数;
- Content-Length: 7 —>post请求 请求体长度;
- Upgrade-Insecure-Requests: 1–>>告诉服务器,浏览器可以处理https协议.
10.Referer (页面跳转处):表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的等。有时候遇到下载某网站图片,需要对应的referer,否则无法下载图片,那是因为人家 做了防盗链,原理就是根据referer去判断是否是本网站的地址,如果不是,则拒绝, 如果是,就可以下载;
- 请求空行分析:
就是一个分隔符,用来区分请求头和请求体的; - 只有POST请求才有请求体,
因此 POST请求 请求体中存放的是表单提交的键值对。
例如:name=’zs’&age=10
HTTP响应格式
- 响应首行(状态行)分析:
HTTP/1.1 200 OK
包含 协议–>>HTTP/1.1, 响应码(状态码)—>>200 , 状态码描述—>>OK
状态码:
- 200: 服务器很好的处理了客户端的请求,一切 OK
- 302: 重定向
例如经常去一家饭店吃饭,突然某一天饭店搬迁,只剩下一个门,门上写着新 店在左边100米处,然后你根据纸条找到新饭店; 302就相当于门上的条,当你 访问一个网站时他给你返回302你需要重新访问新的网址; 这里面发生了2次请求 - 304:通常表示资源文件在服务器没有更改,而浏览器端又有缓存,这时候回送 304 状体码通知浏览器拿本地的缓存显示
- 404:表示客户端访问的资源路径有问题或者资源问题不存在
- 500:表示服务器出现了 异常.
- 响应头部分析:
- server: Apache-Coyote/1.1—>> 服务器版本号
- Set-Cookie: JSESSIONID=ECA8005D1235BBB6B9CFCC338A8206FD;
Path=/03test; HttpOnly学cookie时在讲 - Content-Type: text/html;charset=ISO-8859-1响应字符集,告诉浏览器以什么样的字符集解码;
- Content-Length: 265 响应体长度
- Date: Fri, 23 Jun 2017 13:45:01 GMT 发送日期 少8个小时;
- Expires: -1、Cache-control:no-cache、Pragma:no-cache 三个响应头一起使用, 表示禁止浏览器缓存当前页面. 每个浏览器厂商对认识的禁止头不同因此三 个一起使用。
Web介绍
- web指的是网络,web应用开发指的是基于网络的应用程序开发。
- Web应用开发分为web前端开发和web后端开发。
- Web前端开发:我们可以简单的理解为开发一些网页。
- Web后端开发:写一些逻辑判断程序。
当用户发出请求给我们写的程序,程序根据用户的请求做出相应的判断,然后返回给客户相应的内容。
C/S架构
C/S即:Client与Server ,中文意思:客户端与服务器端架构。
这里的客户端一般泛指客户端应用程序exe,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。B/S架构
B/S即:Browser与Server,中文意思:浏览器端与服务器端架构。
只需在浏览器上通过HTTP去请求服务器端相关的资源(网页资源)。
执行流程:
浏览器发出一次请求给服务端,服务端通过逻辑判断把相应的数据发送给客户端。
依次执行上面的流程。
WEB框架的本质
所有的Web应用框架本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 一些常用框架(Django、Tornado、Flash)是对socket服务端进行的封装,使得基础功能更加完善。
总结
- web框架的本质:socket 服务端 与浏览器的通讯。
- socket 服务端功能可以划分为3部分:
- a.负责与浏览器收发消息(socket)在python中有专门的框架
wsgiref/uWsgi/gunicorn… - b.根据用户访问不同的路径执行不同的函数
- c.从HTML中读取出内容,并且完成字符串的替换
- Python中 web 框架的分类:
- 按照2上面的功能分类
(1).框架自带a,b,c 功能 ----> Tornado
(2).框架自带b,c,使用第三方的a ---->Django
(3).框架自带b,使用第三方的a,c ---->Flask
-按照另一个维度划分
(1).Diango ,Tornado–>大而全(做一个网站用到的技术都有)
(2).其他 例如 Flask 轻量级只封装了核心功能。
a部分和b、c 部分通讯需要遵守WSGI 协议。
多任务
多任务就是同一时刻多个任务同时执行,例如开演唱会时明星一边唱歌一边跳舞,开车时眼睛看路手操作方向盘。这些都是多任务场景。
对于电脑来说多任务就是同时运行多个应用程序,例如 qq、微信、浏览器等等同时在电脑
上运行。
1、电脑实现多任务的原理
例如 qq、微信、网易云音乐播放器 3 个应用程序能同时运行是因为 CPU 在多个应用程序
之间高速切换的结果,当 CPU 切换到了 qq,就用 0.01s 时间(时间不确定)执行 qq 程序,然
后再随机切换到其他应用程序在执行一段时间,CPU 在多个程序之间快速往复执行,我们
的肉眼根本感觉不到卡顿,导致我们的错觉感觉是同时运行的效果。如果电脑运行了多个
程序有时候会出现卡顿现象是因为 cup 切换不过来了。
2.单核、双核 CPU 介绍:
单核 CPU 指的是 CPU 中有一个核心(形象理解 CPU 是人的头,核心是头里面包含的大
脑),用来处理程序。
双核/四核 CPU 就是 CPU 中有 2 个或者 4 个核心,(1 个脑袋中长了 2 个大脑或者 4 个大
脑),相当于有 2 个单核 CPU 或者是 4 个单核 CPU
进程
什么是进程
- 运行起来的应用程序就称之为进程。也就是说当程序不运行的时候我们称之为程序,
- 当程序运行起来他就是一个进程。通俗的理解就是不运行的时候是程序,运行起来就是进程。
- 程序和进程的对应关系是:程序只有一个,但是进程可以有多个。
- 进程是系统进行资源分配和调度的基本单位。
创建多进程
-
不使用多进程实现控制台先打印唱歌然后在打印跳舞。
花费了 6s 的时间。 -
使用进程让唱歌和跳舞一起执行。
花费了 3s 的时间,提高了程序的运行效率。
程序理解:
主进程从 main()开始执行,执行 main 函数体,当执行到 p1.start()时,创建一个子进
程,p1 子进程中的代码和主进程相同,只是程序执行的开始是 sing 函数体。
主进程执行到 p2.start()时,同样复制一份主进程代码从 danc 函数体开始执行。
从上面我们可以看出来,使用进程方式实现多任务耗费的资源比较大,因为一个进程就需
要使用一份系统资源。
进程的状态
在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。
(1)就绪(Ready)状态
当进程已分配到除 CPU 以外的所有必要的资源,只要获得处理机便可立即执行,这时的进
程状态称为就绪状态。
(2)执行/运行(Running)状态当进程已获得处理机,其程序正在处理机上执行,此时
的进程状态称为执行状态。
(3)阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃
处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待 I/O 完成、申请缓冲
区不能满足、等待信件(信号)等。
进程之间通讯
刚才我们说了进程可以理解为复制了一份程序有加载到了内存了,进程之间是独立的,如果我想两个进程之间进行通讯怎么办呢?我们可以使用 Queue 队列,队列是一种先进先出的存储数据结构,就比如排队上厕所一个道理。
两个进程通讯,就是一个子进程往queue中写内容,另一个进程从queue中取出数据。就实现了进程间的通讯了
(1) .queue 队列
- 创建 queue 队列对象
q = multiprocessing.Queue(3) # 3 表示只能存放 3 个数据
参数 :maxsize 是队列中允许的最大项数。如果省略此参数,则无大小限制。
返回值 q 是队列对象 - put()方法 ,向队列中存放数据。如果队列已满,此方法将阻塞至有空间可用为止。
- get()返回 q 中的一个项目。如果 q 为空,此方法将阻塞,直到队列中有项目可用为
止。 - get_nowait(): 不等待,直接抛出异常
- full()如果 q 已满,返回为 True
- q.empty() 如果调用此方法时 q 为空,返回 True。
练习 1:使用 queue 模拟多任务下载和处理数据
进程池
- 当需要创建的子进程数量不多时,我们可以直接利用 multiporcessing 中的 Process 动态生成多个进程,但是如果现在有 100 个任务需要处理,那我们需要多少个子进程呢,如果我们创建 100 个子进程也可以实现,但是资源比较浪费。我们也可以创建指定个数个子进程,例如只创建 10 个子进程,让着 10 个子进程重复的执行任务,这样就节约了资源。就比如我们去景区湖上游玩,游船是重复利用的。
- 我们可以使用 multiprocessing 模块提供的 Pool 类,也就是进程池,可以到达进程重复利用。
- 创建进程池对象的时候可以指定一个最大进程数,当有新的请求提交到进程池中,如果池中的进程数还没有满,那么就会创建一个新的进程用来执行该请求,但是如果池中的进数满了,该请求就会等待,知道进程池中的进程有结束的了,才会使用这个结束的进程来执行新的任务。
- join 主进程等待所有子进程执行完毕,必须在 close 之后。
- close 等待所有进程结束才关闭线程池
迅雷下载器: