一, Session 的概念
cookie 是在浏览器端保存键值对数据, 而 session 是在服务器端保存键值对数据
session 的使用依赖 cookie: 在使用 Session 后, 会在 Cookie 中存储一个 sessionid 的数据, 每次请求时浏览器都会将这个数据发给服务器, 服务器在接收到 sessionid 后, 会根据这个值找出这个请求者的 Session.
二, Django 中 Session 的存储
session 键值对数据保存
session 的键值对数据默认保存在 django 项目的一张数据库表中 (表名为: django_session), 保存格式如下:
实际上是对数据有加密的, 如下图:
三, Django 中 Session 的配置
Django 中默认支持 Session, 其内部提供了 5 种类型的 Session 供开发者使用:
- 数据库 (默认)
- 缓存
- 文件
- 缓存 + 数据库
- 加密 cookie
1) 数据库 Session
a. 配置 settings.py
- SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎 (默认)
- 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, 默认修改之后才保存 (默认)
2) 缓存 Session
a. 配置 settings.py
- SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
- SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名 (默认内存缓存, 也可以是 memcache), 此处别名依赖缓存的设置
- 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, 默认修改之后才保存
3) 文件 Session
a. 配置 settings.py
- SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
- SESSION_FILE_PATH = None # 缓存文件路径, 如果为 None, 则使用 tempfile
模块获取一个临时地址 tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
- 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, 默认修改之后才保存
4) 缓存 + 数据库 Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5) 加密 cookie Session
a. 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
四, Session 的基本操作:
以键值对的格式写 session
request.session['键']= 值
根据键读取值
- request.session.get('键', 默认值)
- # 或者
- request.session['键']
清除所有 session, 在存储中删除值的部分
request.session.clear()
清除 session 数据, 在存储中删除 session 的整条数据
request.session.flush()
删除 session 中的指定键及值, 在存储中只删除某个键及对应的值
del request.session['键']
设置 session 数据有效时间; 如果不设置, 默认过期时间为两周
request.session.set_expiry(value)
如果过期时间的 value 是一个整数, 则 session 数据 将在 value 秒没有活动后过期.
如果过期时间的 value 为 None, 那么会话永不过期.
如果过期时间的 value 为 0, 那么用户会话的 Cookie 将在用户的浏览器关闭时过期.
四, 以下是使用例子:
- # 发短信接口
- def sms_send(request):
- # http://localhost:8000/duanxin/duanxin/sms_send/?phone=18434288349
- # 1 获取手机号
- phone = request.GET.get('phone')
- # 2 生成 6 位验证码
- code = aliyunsms.get_code(6, False)
- # 3 缓存到 Redis
- #cache.set(phone,code,60) #60s 有效期
- #print('判断缓存中是否有:',cache.has_key(phone))
- #print('获取 Redis 验证码:',cache.get(phone))
- #暂时用 session 处理
- request.session['phone'] = code
- request.session.set_expiry(300) #设置 5 分钟后过期
- print('判断缓存中是否有:', request.session.get('phone'))
- print('获取 session 验证码:',request.session.get('phone'))
- # 4 发短信
- result = aliyunsms.send_sms(phone, code)
- return HttpResponse(result)
- # 短信验证码校验
- def sms_check(request):
- # /duanxin/sms_check/?phone=xxx&code=xxx
- # 1. 电话和手动输入的验证码
- phone = request.GET.get('phone')
- code = request.GET.get('code')
- # 2. 获取 Redis 中保存的 code
- #print('缓存中是否包含:',cache.has_key(phone))
- #print('取值:',cache.get(phone))
- #cache_code = cache.get(phone)
- #获取 session 里的 code
- print('取值:', request.session.get('phone'))
- cache_code = request.session.get('phone')
- # 3. 判断
- if code == cache_code:
- return HttpResponse(JSON.dumps({'result':'OK'}))
- else:
- return HttpResponse(JSON.dumps({'result':'False'}))
欢迎访问我的博客: http://bigyoung.cn/
参考文档:
- https://www.lagou.com/lgeduarticle/87770.html
- https://www.cnblogs.com/lixiang1013/p/7821749.html
Django 官方文档 (中文版):
来源: http://www.bubuko.com/infodetail-3452379.html