django的cookies和session
这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
1、cookie
cookie:保存状态信息
保存在浏览器本地上的一组组键值对
特性:
- 由服务器让浏览器进行设置的
- cookie信息保存在浏览器本地的,可以浏览器有权不保存
- 浏览器再次访问时自动携带对应的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的大小和个数有一定限制的
过程:
- 第一个请求,没有cookie,设置键值对,根据浏览器生成一个唯一标识,给一个字典设置键值对。
- 字典转成字符串(序列化),进行加密,将唯一标识和字符串保存在数据库中(django_session)
- 返回给浏览器唯一标识(sessionid)的cookie
- 下次请求携带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,默认修改之后才保存(默认)