1.cookie 与 session 的简述:
为什么会有这些技术:
1. 目的: 是为了保存客户端的用户状态
2. 原因: HTTP 协议是无状态的
2.cookie:
(1) 保存在客户端浏览器上的键值对; cookie 虽然是保存在客户端浏览器上的键值对但是他是有服务端设置的; 浏览器有权禁止 cookie 的写入.
(2)django 如何操作 cookie
obj=HTTPResponse()
1. 利用对象你才可以操作 cookie
- obj = HttpResponse
- return obj
- obj = render()
- return obj
- obj = redirect()
- return obj
2. 如何设置 cookie:
obj.set_cookie('k1','v1')# 告诉浏览器设置
3. 如何获取 cookie:
- request.COOKIES.get('k1')# 获取浏览器携带过来的 cookie 值
- request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
- # 参数: default: 默认值, salt: 加锁盐, max_age: 后台控制过期时间
4. 如何设置 cookie 的超时时间:
- obj = set_cookie('k1','v1',max_age=3)
- obj = set_cookie('k1','v1',expires = 3)
- # 两个参数都是设置超时时间, 并且都是以秒为单位
- # 区别: 如果你想给 IE 浏览器设置 cookie 的超时时间你只能用 expires
- 3.session
保存在服务端上面的键值对; session 的工作机制是需要依赖于 cookie 的.
session 请求流程图:
- # 获取, 设置, 删除 Session 中数据
- request.session['k1']
- request.session.get('k1',None)
- request.session['k1'] = 123
- request.session.setdefault('k1',123) # 存在则不设置
- del request.session['k1']
- # 所有 键, 值, 键值对
- request.session.keys()
- request.session.values()
- request.session.items()
- request.session.iterkeys()
- request.session.itervalues()
- request.session.iteritems()
- # 会话 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 失效策略.
Django 中的 session 相关
(1). 设置 session
- request.session['k1']='v1'
- # 第一次设置的时候可能会报错, 这是你需要检查有没有执行数据库迁移命令
- # 生成 Django 需要用到的一些默认表 django_session
- #django 默认的 session 失效时间是 14 天, 也就是两周
- request.session['k1']='v1'
- # 上面这一段代码执行后都发生了哪些事情
- #1.Django 内部自动帮你调用算法生成一个随机的字符串
- #2. 在 django_session 添加数据 (数据也是加密处理)
- #3. 将产生的随机字符串返回给客户端浏览器, 让浏览器保存 "sessionid: 随机字符串"
(2). 获取 session
- request.session.get('k1')
- #1.Django 内部会自动去请求头里面获取 cookie
- #2. 拿着 sessionid 所对应的随机字符串去 django_session 表中一一比对
- #3. 如果对比上了, 会将随机字符串对应的数据获取出来, 自动放入 request.session 中供程序员调用, 如果没有就是一个空字典
(3). 删除 session
- request.session.delete()
- # 客户端和服务端全部删除, 只会根据浏览器的不同删除对应的数据
(4). 如何设置失效时间
设置会话 session 和 cookie 的超时时间
- request.session.set_expiry(value)
- # 如果 value 是个整数, session 会在秒数后失效
- # 如果 value 是个 datetime 或者 timedelta,session 就会在这个时间后失效
- # 如果 value 是 0, 用户关闭浏览器 session 就会失效
- # 如果 value 是 None,session 会依赖全局 session 失效策略.
(5).Django 中的 session 配置:
Django 中默认之处 session, 内部提供了五中类型的 session 供开发者使用.
1. 数据库 Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎 (默认)
2. 缓存 Session
- SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
- SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名 (默认内存缓存, 也可以是 memcache), 此处别名依赖缓存的设置
3. 文件 Session
- SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
- SESSION_FILE_PATH = None # 缓存文件路径, 如果为 None, 则使用 tempfile 模块获取一个临时地址 tempfile.gettempdir()
4. 缓存 + 数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密 Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用设置项:
- 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, 默认修改之后才保存 (默认)
Django 中 Session 相关设置
数据库 Session
来源: http://www.bubuko.com/infodetail-3316903.html