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转换HTML到Text纯文本的方法
Jan 15 Python
python基于xmlrpc实现二进制文件传输的方法
Jun 02 Python
Python数组定义方法
Apr 13 Python
Python中操作符重载用法分析
Apr 29 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
python读取LMDB中图像的方法
Jul 02 Python
Django model反向关联名称的方法
Dec 15 Python
Django logging配置及使用详解
Jul 23 Python
使用python telnetlib批量备份交换机配置的方法
Jul 25 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
Sep 05 Python
python logging添加filter教程
Dec 24 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 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
基于mysql的论坛(4)
2006/10/09 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
php简单中奖算法(实例)
2017/08/15 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
DOM 高级编程
2015/05/06 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
js实现移动端吸顶效果
2020/01/08 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
Python新手们容易犯的几个错误总结
2017/04/01 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
django主动抛出403异常的方法详解
2019/01/04 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
python实现五子棋程序
2020/04/24 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
CSS3 实现的加载动画
2020/12/07 HTML / CSS
HTML5注册页面示例代码
2014/03/27 HTML / CSS
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
老干部座谈会主持词
2015/07/03 职场文书
祝酒词范文
2015/08/12 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
公证书
2019/04/17 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP
MySQL 全文检索的使用示例
2021/06/07 MySQL
HTML基础详解(上)
2021/10/16 HTML / CSS