HTTP本身是无状态的,一个请求发送之后和下一个请求是没有直接关系的,但是在实际应用中,需要构建前后exist关系场景,比方说在当当买书,把一本书加入购物车中之后,又狂了一下商城,这时你再回来付款时候,购物车中不能不存在这本书,这就需要Session和Cookie帮助我们保存这样的信息。
Cookie建立在客户端。图解如下:
1.浏览器在向服务器发送第一个不附带Cookie的请求时,服务器拿到这个之后,认证通过返回响应,可以设置这个响应的cookie,cookie中附带信效期;
2.之后,浏览器将解析拿到的cookie保存到本地,浏览器在发送下一次请求或之后的请求中,附带上cookie,服务器收到请求解析cookie识别cookie信息,发现这个cookie确实是第一次自己发送给浏览器的,就返回一个响应;
requests库中获得cookie的方法是:
r=requests.get(url)
r.cookies['cookiename']
下次发送时,就设置cookie:
cookies=dict(c='uid')
requests.get(url,cookies=cookies)
这样的缺点是,每次请求数据都要带上cookie,增加带宽。另外cookie可以伪造,关系到安全问题。
Session建立在服务端。图解如下:
Session这种方式就是在服务器端将用户信息存储下来。
1.浏览器发送第一个请求,服务器开辟资源用来存储session;(会话管理器是系统中第一个创建的用户态模式进程)
2.服务器给一个response也带有cookie,但是这个时候,占用带宽很小,可能只是简单的返回了一个 session-id,这个session-id是什么根据服务器采取的策略定,可能是一个认证码;
3.在之后的浏览器请求中,带上cookie,服务器将session-id解析出来,去跟数据库匹配,查看这个session-id对应的权限信息,用户信息到底是什么。这个过程就是把存储从浏览器转移到了服务器端。
session和cookie其实就是将带宽压力转移成了服务器的存储压力,requests库主要是支持编程,对于服务器端编程,可以借助框架Django等都有实现session,cookie的机制。