状态保持(cookie和session)
一、cookie
面试题:
谈谈你对cookie的理解?
答: 先说概念, 再说流程, 最后从http协议的角度上说
概念: 保存在客户端的数据
流程:
第一次请求过程
1. 我们的浏览器第一次请求服务器的时候,不会携带任何cookie信息
2. 服务器收到请求后, 发现请求中没有任何cookie信息
3. 服务器会在响应中设置cookie
4. 我们的浏览器收到响应后, 发现响应中有cookie信息,会把cookie信息保存起来
第二次及其之后的过程
1. 当我们的浏览器第二次及其之后的请求都会携带cookie信息
2. 我们的服务器收到请求后, 会发现请求中携带的cookie信息,这样的话就知道是谁的请求了
cookie是保存在客户端的
cookie是基于域名(IP)的 (遵循同源策略)
1.设置cookie
可以通过HttpResponse对象中的set_cookie方法来设置cookie。
HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
示例:
def cookie(request):
response = HttpResponse('ok')
response.set_cookie('xcooo1', 'python1') # 临时cookie
response.set_cookie('xcooo2', 'python2', max_age=3600) # 有效期一小时
return response
2 读取Cookie
def cookie(request):
cookie1 = request.COOKIES.get('xcooo1')
print(cookie1)
return HttpResponse('OK')
3 删除Cookie
response.delete_cookie('xcooo2')
或者
response.set_cookie(key,value,max_age=0)
二、session
面试题:
问题1 : 我换了浏览器,还能获取到session信息麽? 可以 不可以
答: 不可以, session依赖于cookie
问题1 : 谈谈你对session的理解?
答: 先说概念, 再说流程, 最后从http协议的角度上说
概念: 保存在服务端的数据, session 依赖于cookie
流程:
第一次请求过程
1. 我们第一次请求的时候可以携带一些信息(用户名/密码), cookie中没有任何信息
2. 当我们的服务器收到请求后, 进行用户名和密码的验证, 验证成功设置session信息
3. 在设置session信息的同时(session信息保存在服务端), 服务器会在响应头自动设置一个sessionid
4. 客户端(浏览器)收到这个响应之后, 会将cookie信息保存起来(保存sessionid 的信息)
第二次及其之后的过程
1. 第二次及其之后的请求都会携带sessionid 的信息
2. 当服务器收到这个请求, 会获取到sessionid的信息, 然后进行验证,验证成功,则可以获取 session信息 (session信息保存到服务器端)
如果浏览器禁用了cookie, 则session不能实现
1 启用Session
Django项目默认启用Session。
可以在settings.py文件中查看
2 存储方式
2.1 数据库
SESSION_ENGINE='django.contrib.sessions.backends.db'
2.2 本地缓存
SESSION_ENGINE='django.contrib.sessions.backends.cache'
2.3 混合存储
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
2.4 Redis
1) 安装扩展
pip install django-redis
2)settings.py配置
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
注意: 如果redis的ip地址不是本地回环127.0.0.1,而是其他地址,访问Django时,可能出现Redis连接错误
解决方法:
修改redis的配置文件,添加特定ip地址。
sudo vim /etc/redis/redis.conf
重新启动redis服务
sudo service redis-server restart
3 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)
1. 如果value是一个整数,session将在value秒没有活动后过期。
2. 如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
3. 如果value为None,那么session有效期将采用系统默认值, 默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。
评论
3条评论repostone Lv.1
Chrome 63.0.3239.132
Windows 8.1 x64 Edition 回复
非技术的路过。
北京市 移动
VPS234 Lv.1
Chrome 76.0.3809.132
Windows 回复
Python我除了知道这个框架做web,其他的还真不熟悉
四川省成都市 电信
辛诚
Chrome 76.0.3809.100
Windows 回复
回复了VPS234:是的
湖南省常德市 电信