无状态请求
基于http协议的web应用,是请求-应答模式,这是无状态的。就是说,每次请求都是独立的,它的执行结果和状态和之后的请求是没有直接关系的,不会收到之前请求应答情况的直接影响,也不会影响后面的请求应答情况。
有状态请求
比如在浏览博客网,网站可以直接记住用户的登录状态,在无状态下这是无法做到的。在无状态下,服务端不认识客户端。
服务端要记住客户端,就需要cookie。就是在客户端访问服务端时,服务端给客户端生成一个id来标记它,让后返回给客户端,客户端把这个id存储在本地的cookie里。(这个cookie是在这个服务端的域之下)
下次客户端请求服务端时,会带着cookie里的id,服务端就会认识,就会把id为1中的信息取出返回。
如下图,登录成功的博客网,浏览器会在本地的cookie下的该域名下,以键值对的方式存储cookie,下次浏览器再访问博客网,就能用cookie直接登录。
如果我这时清空cookie,服务端就不认识这个客户端了,刷新就会失去登录状态。
session
在访问django服务器时,如果要登录,就要给出账户信息,原始的方式就是在cookie里放一个{'username':'xxx','password':'xxx'}的键值对。但这样显然不安全。
这时就需要sessionid。
在settings中的installed_app中,默认带有'django.contrib.sessions'。
当做migrate时,django会在db中创建一张表,django_session。
当有账户登录时,sessions会拦截request,如果带有sessionid,就去表中查找对应的session_key,找到,就解密session_data中的账户信息。
找不到,则进入登录流程。
当服务端response时,sessions也会把sessionid加入进去返回给浏览器。