Django中的session用法详解


Posted in Python onMarch 09, 2020

一、Session 的概念

cookie 是在浏览器端保存键值对数据,而 session 是在服务器端保存键值对数据 session 的使用依赖 cookie:在使用 Session 后,会在 Cookie 中存储一个 sessionid 的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到 sessionid 后,会根据这个值找出这个请求者的 Session。

二、Django 中 Session 的存储

session 键值对数据保存

Django中的session用法详解

session 的键值对数据默认保存在 django 项目的一张数据库表中(表名为:django_session),保存格式如下:

Django中的session用法详解

实际上是对数据有加密的,如下图:

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

4)

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,默认修改之后才保存

缓存+数据库 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/lgeduar... https://www.cnblogs.com/lixia... Django 官方文档(中文版): https://docs.djangoproject.co...

总结

到此这篇关于Django中的session用法详解的文章就介绍到这了,更多相关django session 使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Pythont特殊语法filter,map,reduce,apply使用方法
Feb 27 Python
Python数据类型详解(三)元祖:tuple
May 08 Python
Python检测网络延迟的代码
May 15 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
基于python实现学生信息管理系统
Nov 22 Python
PyTorch使用cpu加载模型运算方式
Jan 13 Python
解决tensorflow训练时内存持续增加并占满的问题
Jan 19 Python
Python列表去重复项的N种方法(实例代码)
May 12 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 Python
python基于tkinter实现gif录屏功能
May 19 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
May 22 Python
python实现引用其他路径包里面的模块
Mar 09 #Python
python+opencv边缘提取与各函数参数解析
Mar 09 #Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 #Python
Pycharm+Python工程,引用子模块的实现
Mar 09 #Python
python的sys.path模块路径添加方式
Mar 09 #Python
python游戏开发的五个案例分享
Mar 09 #Python
Python IDLE或shell中切换路径的操作
Mar 09 #Python
You might like
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
PHP实现图片压缩
2020/09/09 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
2011/04/16 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
关于Vue单页面骨架屏实践记录
2017/12/13 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
Vue+Django项目部署详解
2019/05/30 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
Python实现进程同步和通信的方法
2018/01/02 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
python列表推导式入门学习解析
2019/12/02 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
Matplotlib自定义坐标轴刻度的实现示例
2020/06/18 Python
Python 可视化神器Plotly详解
2020/12/26 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
洗煤厂厂长岗位职责
2014/01/03 职场文书
社区关爱留守儿童活动方案
2014/08/22 职场文书
入党积极分子自我批评思想汇报
2014/10/10 职场文书
论群众路线学习笔记
2014/11/06 职场文书
单位租房协议范本
2014/12/03 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技