Cookies与Session
一、什么是会话
从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次会话
HTTP协议是无状态的,与导致会话状态难以保持
试想一下,如果不保持会话状态,在电商网站购物的场景体验?
Cookies和Session就是为了保持会话状态而诞生的两个存储技术
二、Cookies的特点
cookies在浏览器上是以键-值对的形式进行存储的,键和值都是以ASCII字符串的形存储(不能是中文字符串)
存储的数据带有生命周期
cookies中的数据是按域存储隔离的,不同的域之间无法访问
cookies的内部的数据会在每次访问此网址时都会携带到服务器端,如果 cookies过大会降低响应速度
三、Cookies的使用
HttpResponse.set_cookie(key,value=’‘,max_age=None,expires=,None)
key:cookie的名字
value:cookie的值
max_age:cookie存活时间, 秒为单位
expires:具体过期时间
当不指定最大年龄和到期时,关闭浏览器时此数据失效
本质是响应头有了set_cookie来实现的
存储示例:
添加cookie
#为浏览器添加键为my_var1,值为123,过期时间为1个小时的cookie
responds = HttpResponse("已添加 my_var1,值为123") responds.set_cookie('my_var1', 123,3600)
return responds 。
修改cookie
#为浏览器添加键为my_var1,修改值为456.过期时间为2个小时的 cookie
responds = HttpResponse("已修改my_var1,值为456")
responds.set_cookie('my-yar1',456,3600*2)
return responds 、
删除Cookies
HttpResponse.delete_cookie(key) #删除指定的key的Cookie,如果key不存在则什么也不发生
获取Cookies
通过request.COOKIES定的字典(dict)获取户端的COOKIES
数据 value = request.COOKIES.get(‘cookies名”, ‘默认值)
本质是请求头从浏览器走向服务器,肯定是有效期内的
四、Session的使用
Session数据存在了服务器上,但是cookies是存在浏览器中
针对不同浏览器不同的存储空间,把状态数据都放在存储空间内,每个存储空间有一个标识SessionID,可以取出存储空间内的数据,把SessionID放在Cookies中,检查SessionID是否已存在与服务器端,来达到验证的效果,但是要拿到SessionID,需要Cookies的支持
session是在服务器上开辟一段空间用于保留浏览器和服务器交互时的重要数据
实现方式
使用session需要在浏览器客户端启动cookie,且在cookie中存储sessionid
每个客户端都可以在服务器端有一个独立的Session
注意:不同的请求者之间不会共享这个数据,与请求者一一对应
使用方法
settings.py中配置 session
向 INSTALLED APPS列表中添加 INSTALLED_APPS=[ #启用 sessions应用’django. contrib.sessions’]
向MIDDLEWARE列表中添加 MIDDLEWARE =[ #启用 session中间件 django.contrib.sessions. middleware. SessionMiddleware]
具体使用类似字典
session对象是一个类似于字典的SessionStore类型的对象,可以用拟于字典的方式进行操作 session能够存储如字符串,整,字典,列表等。
保存session的值到服务器
request.session[‘KEY]= VALUE
获取session的值
value = request.session[‘KEY’]
value = request.session.get(KEY,默认值)
删除session
del request.sessionl[‘KEY’]
相关配置项
settings. py中相关配置项
SESSION_COOKIE_AGE作用:
指定 sessionid在 cookies中的保存时长(默认是2周),如下: 例如:SESSION_COOKIE_AGE=60*60*24*7*2
SESSION_EXPIRE_A_ BROWSER_CLOSE=True设置只要浏览器关闭时session就失效(默认为 False)
注意: Django中的 session数据存储在数据库中,所以使用 session前需要确保已经执行过 migrate
存在的问题与解决方式
django_session表是单表设计;且该表数据量持续增持[浏览器故意删掉sessionid&过期数据未删除]
可以每晚执行python manage.py clearsessions[该命令可删除已过期的session数据]
小结
Cookies VS Session
种类 | 存储 | 安全性 |
---|---|---|
Cookies | 浏览器 | 相对不安全 |
session | 服务器 | 相对安全 |
Comments NOTHING