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 相关文章推荐
研究Python的ORM框架中的SQLAlchemy库的映射关系
Apr 25 Python
python导入时小括号大作用
Jan 10 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
python3+PyQt5重新实现自定义数据拖放处理
Apr 19 Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 Python
详解Python函数式编程—高阶函数
Mar 29 Python
Python集中化管理平台Ansible介绍与YAML简介
Jun 12 Python
Flask配置Cors跨域的实现
Jul 12 Python
numpy ndarray 取出满足特定条件的某些行实例
Dec 05 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
Jun 04 Python
详解anaconda安装步骤
Nov 23 Python
Django框架模板用法详解
Jun 10 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
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
php 代码优化的42条建议 推荐
2009/09/25 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
2013/08/07 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
php函数连续调用实例分析
2015/07/30 PHP
php实现CSV文件导入和导出
2015/10/24 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
2013/12/26 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
2016/08/24 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
react-native ListView下拉刷新上拉加载实现代码
2017/08/03 Javascript
React Native中Navigator的使用方法示例
2017/10/13 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
如何搜索查找并解决Django相关的问题
2014/06/30 Python
python实现二分查找算法
2017/09/21 Python
Django框架登录加上验证码校验实现验证功能示例
2019/05/23 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
python字符串反转的四种方法详解
2019/12/02 Python
python默认参数调用方法解析
2020/02/09 Python
python实现滑雪游戏
2020/02/22 Python
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
物业保安主管岗位职责
2013/12/25 职场文书
师德学习感言
2014/01/31 职场文书
班主任经验交流材料
2014/12/16 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
Nginx禁止ip访问或非法域名访问
2022/04/07 Servers