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的Django框架中编写错误提示页面
Jul 22 Python
python制作爬虫并将抓取结果保存到excel中
Apr 06 Python
python中文乱码不着急,先看懂字节和字符
Dec 20 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
python 自动批量打开网页的示例
Feb 21 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
详解Python自动化之文件自动化处理
Jun 21 Python
浅谈Python中的正则表达式
Jun 28 Python
python实现一个简单的贪吃蛇游戏附代码
Jun 28 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
ip签名探针
2006/10/09 PHP
PHP中操作ini配置文件的方法
2013/04/25 PHP
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
PHP时间函数使用详解
2019/03/21 PHP
php用户名的密码加密更安全的方法
2019/06/21 PHP
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
浅谈javascript 迭代方法
2015/01/21 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
Bootstrap基本插件学习笔记之按钮(21)
2016/12/08 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
d3绘制基本的柱形图的实现代码
2018/12/12 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
python 获取et和excel的版本号
2009/04/09 Python
跟老齐学Python之用Python计算
2014/09/12 Python
在Python中定义和使用抽象类的方法
2016/06/30 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
python使用tcp实现局域网内文件传输
2020/03/20 Python
python中使用zip函数出现错误的原因
2018/09/28 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
解决pyqt5异常退出无提示信息的问题
2020/04/08 Python
如何使用html5与css3完成google涂鸦动画
2012/12/16 HTML / CSS
宿舍使用违章电器检讨书
2014/01/12 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
淘宝好评语句大全
2014/12/31 职场文书
学校开除通知书
2015/04/25 职场文书
法制教育主题班会
2015/08/13 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python
MySQL数字类型自增的坑
2021/05/07 MySQL