django的cookies和session

194 阅读3分钟

django的cookies和session

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

1、cookie

cookie:保存状态信息

保存在浏览器本地上的一组组键值对

特性:

  1. 由服务器让浏览器进行设置的
  2. cookie信息保存在浏览器本地的,可以浏览器有权不保存
  3. 浏览器再次访问时自动携带对应的cookie

为什么要使用cookie?

Http协议是无状态协议,每次请求之间都是相互独立,没有办法保存状态,使用cookie保存状态。

django中操作cookie

# 设置cookie:
response.set_cookie(key,value)  #普通cookie (也在Headers添加了响应头Set-Cookie:is_login=1)
response.set_signed_cookie("key",value,salt="s28")  #加密cookie

设置cookie的参数
# max_age = 5 #超时时间为5秒  (像7天免登录就是设置这个,单位为秒)
# path  cookie生效的路径
# secure=True  https进行传输
# httponly=True  只能http进行传输,无法被js传输
​
​
​
​
# 获取cookie
request.COOKIES  {}  #获取普通cookie(请求头Cookie:is_login=1)
request.get_signed_cookie("key", salt="s28",defalut=" ")  #获取加密的cookie
​
​
# 删除cookie 设置cookie 值为空 超时时间为0
response.delete_cook(key)
​

2、session

保存在服务器上的一组组的键值对,依赖于cookie使用

为什么要使用session?

1. cookie是保存在浏览器本地,不太安全。
2. 浏览器会对cookie的大小和个数有一定限制的

过程:

  1. 第一个请求,没有cookie,设置键值对,根据浏览器生成一个唯一标识,给一个字典设置键值对。
  2. 字典转成字符串(序列化),进行加密,将唯一标识和字符串保存在数据库中(django_session)
  3. 返回给浏览器唯一标识(sessionid)的cookie
  4. 下次请求携带sessionid,服务器根据session找到对应的数据(session_data),进行解密,进行返序列化,根据key获取对应的值。

工作流程:

(1)、当用户来访问服务端时,服务端会生成一个随机字符串;

(2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对加到cookie里发送给用户;

(3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存用户信息;

(4)、再访问服务时客户端会带上sessionid,服务器根据sessionid来确认用户是否访问过网站

session的默认超时时间是2周

django中操作session

# 设置session
request.session[key] = value
# 获取
request.session[key]  request.session.get(key)
#删除
del request.session[key]  request.session.pop(key)
​
# 会话session的key
request.session.session_key
​
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
​
# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")
​
# 删除当前会话的所有Session数据
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush() 
    这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如,django.contrib.auth.logout() 函数中就会调用它。
​
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略
​
配置
from django.conf import global_settings  # 全局配置
点击global_settings查看所有的配置信息
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,默认修改之后才保存(默认)