简介
HTTP协议 是短连接、且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态;
cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录;
参数介绍
1、max_age=1 :cookie生效的时间,单位是秒
2、expires:具体过期日期
3、path='/':指定那个url可以访问到cookie;‘/’是所有; path='/'
4、domain=None(None代表当前域名):指定那个域名以及它下面的二级域名(子域名)可以访问这个cookie
5、secure=False:https安全相关
6、httponly=False:限制只能通过http传输,JS无法在传输中获取和修改
设置cookie
1.普通
response = HttpResponseRedirect('一句话') # 返回客户端一句话 response = redirect('/user/login/') # 重镜像到当前url response =render(request, 'user/changes_pwd.html', content) # 返回前端模板
response.set_cookie("tile","zhangyan",expires=value,path='/' ) response.set_cookie('name',zhangyan, expires=datetime.datetime.now() + datetime.timedelta(days=14))
return response
2.加盐(加签名,防止没篡改)
普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看
response = HttpResponseRedirect('一句话') # 返回客户端一句话 response = redirect('/user/login/') # 重镜像到当前url response =render(request, 'user/changes_pwd.html', content) # 返回前端模板
response.set_signed_cookie('k','v',salt="zhangyan") response.set_signed_cookie('k', 'v', 'name'=zhangyan, expires=datetime.datetime.now() + datetime.timedelta(days=14))
return response
获取cookie
1、普通
cookise = request.COOKIES.get('k', '默认值') cookise = requese.COOKIES.get('name', ',默认值') cookies = request.COOKIES.has_key('uname') # 判断cookie中是否有这个值
2、加盐(加签名,防止没篡改)
cookies=request.get_signed_cookie('k',salt='zhanggen') cookies=request.get_signed_cookie('k',name='zhanggen') cookies=request.COOKIES.has_key('uname') # 判断cookie中是否有这个值
删除cookie
response.delete_cookie('uname')
return response
二、cookie+session
1、cookie引入session:
cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,存在安全隐患,
于是cookie+session出现了!我们可以 把关于用户的数据保存在服务端,在客户端cookie里加一个sessionID(随机字符串),
基于以上原因:cook+session组合就此作古了单单使用cookie做会话保持的方式;
2、cookie+session的工作流程:
(1)、当用户来访问服务端时,服务端生成一个随机字符串;
(2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;
(3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;
3、保存在服务端session数据格式
{
随机字符串 用户信息
傻狍子的随机字符串: {id:1,nam:"alex",account:1000000000 },
二狗子的随机字符串: {id:1,nam:"eric",account:10}
注意:request.session['name']=‘alex’,request.session默认隐含了通过sessionID找到用户信息那一步;
所以现在设置的是用户信息的键(name)和用户信息的值(alex),删除也是如此!
4、最终得出结论了!!!
session的应用 要依赖于cookie:(session就是 cookie的变种)
(1)每次用户第一次访问服务端, 把用户的唯一字符串 session_id加到cookie里面,发送给客户端;
(2)服务器端保存 随机字符串(sessionID:{用户信息})服务端
(3)下次来通过 cookie中的sessionID(键)获取用户信息值(值)
session作用:
会话保持,记住用户的登录状态(WEB网站,分布式架构)
作用(和cookie的区别)
避免了敏感信息保存在客户端,防止客户端修改cookie信息!
设置session
request.session['email'] = '1064145110@qq.com' # 设置session request.session.setdefault('name',123) # 存在则不设置 request.session.set_expiry(value) #设置session超时时间,默认2周 request.session.exists("session_key") # 检查 用户session的随机字符串 在数据库中是否
获取session
request.session.get('name',None) # 这样取值的不报错,没有拿None request.session.has_key('name') # 判断session中是否有name request.session.keys() # 提取所有键 request.session.values() # 提取所有值 request.session.iterkeys() # 迭代键 request.session.itervalues() # 迭代值 request.session.iteritems() # 迭代键值
删除session
request.session.delete("name") # 删除session request.session.flush() # 清除会话数据,在存储中删除会话的整条数据 request.session.clear() #清除用户的所有session数据,用于注销 request.session.clear_expired() # 清除所有已超过自身设定超时时间的session
存储方式
- 存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式
SESSION_ENGINE='django.contrib.sessions.backends.db'
- 存储在缓存中:存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快
SESSION_ENGINE='django.contrib.sessions.backends.cache'
- 混合存储:优先从本机内存中存取,如果没有则从数据库中存取
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'
设置setting.py
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
使用Redis存储Session
将服务器端的session信息保存到数据库的相关配置
- 安装包。
pip install django-redis-sessions
- 修改settings文件,增加如下项:
SESSION_ENGINE = 'redis_sessions.session' SESSION_REDIS_HOST = 'localhost' SESSION_REDIS_PORT = 6379 SESSION_REDIS_DB = 2 SESSION_REDIS_PASSWORD = '' SESSION_REDIS_PREFIX = 'session'’