一 http无状态
定义:
HTTP无状态协议,是指协议对于交互性场景没有记忆能力。通俗点说,http不记录任何状态,也就无法维持会话。
例子:
购物商城买东西,当登陆成功后,跳转到购买页面,此时再添加商品,服务器跳转到购买商品的接口,无法判断是否合法,就需要再登陆一遍。因为登陆的那个响应已经结束,而Http不记录任何状态,因此服务器要重新调用登陆那个接口才能让用户添加商品。
二 cookie
1.cookie
由于HTTP是一种无状态的协议,服务器单纯从网络连接上无从知道客户身份。Cookie就来解决这个问题
(1)cookie是什么:cookie是浏览器的技术,Cookie具体指的是一段小信息,它是服务器发送出来存储在浏 览器上的一组组键值对,可以理解为服务端给客户端的一个小甜点,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
(2)cookie原理:
浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到相应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
(3)cookie传输:
Cookie是通过HTTP请求头和响应头在客户端和服务器端传递的。客户端发送给服务器端的请求头里cookie格式a=A;b=B;c=C。多个Cookie用分号离开。服务器端发送给客户端的响应头里叫Set-Cookie。
2.django中的cookie操作
(1)设置cookie
Django里通过响应信息设置cookie。响应信息指的是render、redirect和HttpResponse返回的信息。
rep = HttpResponse(...) rep = render(request, ...) rep = redirect(...) rep.set_cookie(key,value,...) #方式一 rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...) #方式二 return rep
参数:
key, 键 value='', 值 max_age=None, 超时时间 (以s为单位) expires=None, 超时时间 path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 domain=None, Cookie生效的域名 secure=False, https传输 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
(2)流程梳理
以登陆页面为例:当在登陆login接口设置cookie后,用户通过浏览器登陆成功后,就会在本地浏览器保存cookie键值对。用户对其他页面如index、home访问时,只需要携带cookie键值对就行(不需要登陆信息),index和home接口对cookie信息判断。
(3)cookie取值
变量名=request.COOKIES.get('键')
if 变量名==’值’: 注:这个值是字符串形式。网络传输只认字符串。
(4)cookie装饰器
每个页面都需要进行cookie验证,因此可以做一个装饰器。cookie验证主要做两个:一是cookie取值,二是判断处理不同的逻辑。提取相同的部分,放在装饰器即可。
def loginauth(func): def inner(request,*args,**kwargs): is_login = request.COOKIE.get(‘is_login’) if is_login == ‘True’: ret=func(request,*args,**kwargs) return ret else: return redirect(‘login’) return func
然后在需要验证的函数上一行加@loginauth即可。不需每个页面再进行验证。
(5)cookie其他操作
a删除cookie
def logout(request): rep = redirect("/login/") rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值 return rep
三 session
1.session介绍
Cookie虽然解决了‘保持状态’问题,但它不仅有大小的限制,而且相对来讲不安全,即可以通过浏览器看到明文的cookie键值对。因此出现session,可以支持更多字节,而且保留在服务端,更加安全。
流程:用户通过浏览器第一次访问服务器时,带着用户信息和一个空的cookie字典。服务器验证成功后,生成一个随机字符串sessionid,并将该随机字符串返回给用户的浏览器,同时将随机字符串和用户信息存在数据库里。当用户第二次请求该服务器时,只需携带随机字符串,服务器根据随机字符串从数据库里取出用户信息进行对比或者返回给用户。
Cookie机制图:
2.Django中的session操作
(1)设置session
request.session['键']=值
上面设置session做三件事:
#1.生成session_id(随机字符串) #2.在cookie里面加上键值对:session_id:随机字符串 #3.将用户的数据加密,并保存到django_session表里
(2)取session
变量名=request.session.get('键')
或者变量名=request.session['键']
注:推荐用上面这种。get取不到值会返回None。这样当服务端把sessionid清掉,而客户端再来访问不会报错。
#上面这句话: #1.从cookie里面拿出session_id这个随机字符串 #2.取django_session表里查询到相应的数据 #3.反解加密的用户数据,并获取用户需要的数据
(3)session其他操作
a删除
def logout(request):
# 删除所有当前请求相关的session和浏览器的cookie
request.session.flash()
return redirect("/login/")
b、django提供五种类型的session:数据库Session、缓存Session、 文件Session、缓存+数据库、加密Cookie Session