Django中状态保持之Session详解

网友投稿 734 2022-05-30

引言——上文讲的是cookie,但是cookie的键和值都是明文的形式存储在客户端浏览器上,很不安全!

那有没有更好些的来存储登录状态的方式呢???

这就需要讲讲session了!

1.状态保持——cookie和session:

HTTP协议是无状态的:每次请求都是一次新的的请求,不会记得之前通信的状态。

客户端与服务端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务端存储与会话有关的数据。

存储方式包括cookie,session,会话一般指session对象。

使用cookie,所有数据存储在客户端,注意不要存储敏感信息。

使用session方式,所有数据存储在服务器端(以键值对形式存储),在客户端cookie中存储session_id,用户的重要信息是不会存储在客户端的,下次用户登录只需校验session_id即可,安全!!!

状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据。

注意:不同的请求者之间不会共享这个数据,与请求者一一对应。

2.来讲讲session的由来:

Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。

问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。

我们可以给每个客户端的Cookie分配一个唯一的id(sessionid),这样用户在访问时,通过Cookie(获取其内的sessionid值),服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的sessionid,在服务器上保存一段时间的私密资料,如“账号密码”等等。

总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。

另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。

3.Session的特点:

session是以键值对进行存储的。

session依赖于cookie。唯一的标识码保存在sessionid cookie中。

session也是有过期时间。

4.讲一讲Session流程:

当用户登录以后,生成一个字典{key, value},将字典存入服务端session,key是自动生成的一段字符串标识,配合value是一个自定义格式的字典类型,返回cookie保存到用户浏览器端

Django中状态保持之Session详解

在1步骤生成的字典value中自定义格式来存储用户的信息,如user信息,iflogin等。

当我们在django中用到session时,cookie由服务器端随机生成,写到浏览器的cookie中。每个浏览器都有自己的cookie值,是session寻找用户信息的唯一标识。每个浏览器请求到后台接收的request.session等价于在1中session字典的key(cookie)对应的value。这样我们就能识别出用户,并判断其状态!

5.实战使用——分三步走来操作一波:

(注: 使用session之前需要先执行makemigrations,migrate的模型映射文件命令,在数据库中有生成django_session的表)

第一步:使用之前确保项目目录下的settings.py文件中已经配置好下面两个地方!

第二步:通过观察可知,在我们的数据库中已经映射了对应的表!

查看表结构发现:其中有三个字段,分别是:

session_key(就是上面所说的session_id);

session_data(就是对应的用户的隐私数据);

expire_date(就是session的过期时间)

第三步:session的简单操作(设置;服务端获取;删除)

启用会话后,每个HttpRequest对象将具有一个session属性,它是一个既可读又可写的类似于字典的对象,表示当前的会话。

get(key, default=None):根据键获取会话的值

flush():删除当前的会话数据并删除会话的Cookie

from django.views import View #使用类视图,要导入! from django.http import HttpResponse class Test08(View): def get(self,request): #对session的设置 request.session["name"] = "xiaoming" request.session.set_expiry(100) #设置过期时间,单位为秒。到时间则自动删除。 (比如你网页登录12306,多久时间内再次登录可不用重新登录!) # 对session的访问,只能在服务端获取! name = request.session.get("name","未登录") #第二个参数为默认值。如果获取的键不存在则显示默认值。 print(name) # 对session的删除 #(比如网页中登录12306之后,你退出!) request.session.flush() return HttpResponse("完成!")

注意:

观察可知:客户端中存储的cookie中有sessionid键值对(但是没有值,即不会存储用户的隐私数据),而sessionid的值刚好与服务端中session表中的session_key值相同!(用户的隐私数据是仅仅存储在服务端中的,安全哦!)

拓展——会话过期时间细谈:

第一种设置的方法:

set_expiry(value):设置会话的超时时间

如果没有指定,则两个星期后过期

如果value是一个整数,会话将在values秒没有活动后过期

若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期

如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期

如果value为None,那么会话永不过期

第二种设置的方法:

(settings.py文件中的配置;可以不配置,那么都是默认的选项)

Django HTTP 网络

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:什么是 Kafka Streams 以及它们是如何实现的?
下一篇:【亿码当先,云聚金陵】华为云MVP周峥:气象预报是个技术活,大数据、超算、AI,缺一不可
相关文章