django框架中的cookie与session
cookie
因为http是一个无状态协议,无法记录用户上一步的操作,所以需要状态保持。
cookie和session的区别:
1.cookie是保存在浏览器本地的,所以相对不安全。cookie是4k的大小,最多保存20条(因为最原始的浏览器的本地是很小的,只是一个历史数据,但是其实是不精确的),默认的过期时间是14天。
2.session是保存在服务器的,是相对安全的,session依赖于cookie,sessionid保存在cookie中,理论上无大小限制。
3.相同点:都是实现状改保持,都是有服务器产生的,都有过期时间,都可以自己定义过期时间。
1.设置cookie
在响应里面设置cookie
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)

2.读取cookie
可以通过HttpRequest对象的COOKIES属性来读取本次请求携带的cookie值。request.COOKIES为字典类型。
session
session的理解需要从两个方面去理解
广义上:session机制 —会话,用于记录多次http请求之间的关系,关系就是状态数据
狭义上:session数据— 保存session机制状态的数据。
1.启用session
Django中是默认启用session的,在setting中中间件已经设置好的,如果禁用,就删掉或注释。
2.存储方式
2.1数据库存储
flask把默认情况下的session放在cookie中,也就是浏览器中
SESSION_ENGINE=‘django.contrib.sessions.backends.db’
默认存储在数据库中的存储方式
如果存储在数据库中还需要在INSTALLED-APPS配置中安装session的app
在数据库表中就可以看到一个django_session表
2.2本地缓存
存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。
SESSION_ENGINE=‘django.contrib.sessions.backends.cache’
保存本地的问题:
在多机情况下存在跨机访问的问题
多个服务器保存一份代码的原因:
为了保证并发量
QPS:每秒的请求次数
防止宕机:不是代码可以解决的问题,用到redis里面的哨兵机制。
2.3混合存储
优先从本机内存中存取,如果没有则从数据库中存取。
SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db’
2.4redis
1.安装扩展
pip install django-redis
引入的这个扩展可以直接当做是session的后端来使用
2.配置
在setting.py中配置如下内容
本质就是在本地缓存的基础上增加了一个后端的配置,
通过HttpRequest对象的session属性进行会话的读写操作。
1)以键值对的格式写session。
request.session[‘键’]=值
2)根据键读取值。
request.session.get(‘键’,默认值)
3)清除所有session,在存储中删除值部分。
request.session.clear()
4)清除session数据,在存储中删除session的整条数据。
request.session.flush()
5)删除session中的指定键及值,在存储中只删除某个键及对应的值。
del request.session[‘键’]
6)设置session的有效期
request.session.set_expiry(value)
• 如果value是一个整数,session将在value秒没有活动后过期。
• 如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
• 如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。(以秒为单位)