d y 04 cookie和session
1 cookie
cocokie和session
cookie的由来
大家都知道HTTP协议是无状态的。
无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,所以它不会受到前面的请求和响应情况响应
一句有意思的话来描述就是人生只如初见,对服务器来说,每次的请求都是全新的。
状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。因此cookie就是在这样一个场景下诞生。
有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
- 实现状态保持主要有两种方式:
- 在客户端存储信息使用`Cookie`
- 在服务器端存储信息使用`Session`
什么是cookie
cookie翻译成中文意思是曲奇饼、饼干。然而,在因特网内cookie就和饼干没关系了。cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
Cookie以键值对的格式进行信息的存储。
Cookie基于域名安全,不同域名的Cookie是不能互相访问的,如访问jd.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到jd.com写的Cookie信息。
当浏览器请求某网站时,会将浏览器存储的跟网站相关的所有Cookie信息提交给网站服务器
# expires 按照时间字符串计算过期时间, 浏览器会存在本地缓存路径, 自动删除过期cookie
#只有max_age, 则按秒计算过期时间, 浏览器会存在本地缓存路径, 并自动删除过期cookie
# 若 max_age和 expires 同时存在, 则默认使用 max_age
# 如果设置的cookie时间小于计算机时间, 浏览器则不提取cookie
# 设置cooke
response = HttpResponse('python')
response.set_cookie('name','hualong',expires=50000) # 使用set_cookie设置,
return response
# 读取cookie
cookie1 = request.COOKIES.get('sixstar1')
print(cookie1)
return HttpResponse('OK')
*cookie的流程**
第一次请求过程
1.我们的浏览器第一次请求服务器的时候,不会携带任何cookie信息
2.服务器接收到请求之后,发现请求中没有任何cookie信息
3.服务器设置一个cookie.这个cookie设置在相应中
4.我们的浏览器接收到这个相应之后,发现相应中有cookie信息,浏览器会将cookie信息保存起来
第二次及其之后的过程
1.当我们的浏览器第二次及其之后的请求都会携带cookie信息
2.我们的服务器接收到请求之后,会发现请求中携带的cookie信息,这样的话就认识是谁的请求了
session是什么?
服务器为了保存用户状态而创建的一个特殊的对象。 当浏览器第一次访问服务器时,服务器创建一个session对象(该对象有一个唯一的id,一般称之为sessionId),
session的作用:做状态的保持,比如用户验证登陆保持用户登陆状态
session的应用
对于敏感、重要的信息,建议要储在服务器端**,不能存储在浏览器中,如用户名、余额、等级、验证码等信息。
案例操作
def set_session(request):
"""设置session"""
request.session['username'] = 'tong'
request.session['age'] = 18
return HttpResponse('设置session')
def get_session(request):
"""获取session"""
username = request.session['username']
age = request.session['age']
return HttpResponse(username + ":" + str(age))
def clear_session(request):
"""清除所有session信息"""
request.session.clear()
return HttpResponse('使用clear()清除成功')
def flush_session(request):
"""清除session数据"""
request.session.flush()
return HttpResponse('使用flush()清除成功')
访问set_session视图函数,进行设置,然后访问get_session视图函数进行获取值
当访问过clear_session和flush_session任何一个视图函数时,再访问get_session就会报错,因为已经清除了session,需要再次访问set_session后进行设置,才可以获取到session
5. cooke和session的区别
cookie和session的区别?
Cookie的根本作用就是在客户端存储用户访问网站的一些信息 ,Session的根本作用就是在服务端存储用户和服务器会话的一些信息
cookie 缺陷:增加了流量 安全性成问题 HTTP请求中的Cookie是明文传递的 大小限制在4KB左右
cookie 是保存在客户端,session 的是保存在服务端
cookie 不安全(对敏感数据,需要加密)
session因为有session_id的存在往往要借助cookie来实现,但是非必要,只能说是一种通用性交换的实现方案
如果cookie删除了,或者是浏览器禁用了,那么session也会失效,
session, 可以放在文件中,数据库中,或者内存,都可以,一般用户验证这种场合都会用到session
redis配置
1在虚拟环境中下载redis的安装包
pip install django-redis
2配置 在setting.py中添加配置
# 缓存数据库
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/0',
'OPTIONS': {
'CLIENT_CLASS':'django_redis.client.DefaultClient',
}
},
'code': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS':'django_redis.client.DefaultClient',
}
},
}
# default 库名是不能修改的
# SESSION_ENGINE='django.contrib.sessions.backends.cache_db' # 混合存储
# SESSION_ENGINE='django.contrib.sessions.backends.db' # 缓存指定采用的数据库类型 默认采用数据库
# SESSION_ENGINE='django.contrib.sessions.backends.cache' # redis
# SESSION_CACHE_ALIAS = "default" # 指定缓存的数据库
# session的存储配置
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 将sessin保持到redis中
SESSION_CACHE_ALIAS = 'default' #指定缓存的数据库
# 设置session失效时间,单位为秒
SESSION_COOKIE_AGE = 60*5
redis简单使用
urls.py中定义接口
path('index5/',views.index5),
path('order/',views.order),
views.py中
def index5(request):
# 使用默认数据库
conn = get_redis_connection('default')
print(conn)
# 添加数据
conn.set('age',100)
# 添加哈希数据
# conn.hset('k1','name','长清')
conn.save()
# print(conn.get('age'))
print(conn.hgetall('k1'))
return HttpResponse('设置成功')
def order(request):
# 使用添加的code
conn = get_redis_connection("code")
print(conn)
# conn.set('age', 100)
conn.hset('k1','name','长清')
session = request.session.get('name')
print(session)
conn.save()
# print(conn.get('age'))
print(conn.hgetall('k1'))
# print(conn.hgetall('k2'))
# conn.hdel('k1','name')
# print(conn.hgetall('k1'))
return HttpResponse("获取成功")
6总结
- 1本课程重点是cookie和session的使用,必须掌握。
- 3熟悉cookie和sesion的原理。
- 4 配置redis中为session的缓存。