简介

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'’