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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
深入Python解释器理解Python中的字节码
Apr 01 Python
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
Python数据结构之顺序表的实现代码示例
Nov 15 Python
Python三种遍历文件目录的方法实例代码
Jan 19 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
Python 代码调试技巧示例代码
Aug 11 Python
python实现经纬度采样的示例代码
Dec 10 Python
用Python爬虫破解滑动验证码的案例解析
May 06 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
关于php循环跳出的问题
2013/07/01 PHP
smarty获得当前url的方法分享
2014/02/14 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
js压缩利器
2007/02/20 Javascript
Highslide.js是一款基于js实现的网页中图片展示插件
2020/03/30 Javascript
Expandable "Detail" Table Rows
2007/08/29 Javascript
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
json数据的列循环示例
2013/09/06 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
webpack处理 css\less\sass 样式的方法
2017/08/21 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
python基础教程之循环介绍
2014/08/29 Python
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
Django项目中添加ldap登陆认证功能的实现
2019/04/04 Python
Django框架自定义session处理操作示例
2019/05/27 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
校长新学期致辞
2015/07/30 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python