Django 5种类型Session使用方法解析


Posted in Python onApril 29, 2020

介绍

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

session是基于cookie完成的,当用户打开浏览器,去访问服务器的时候,服务器会为每个用户的浏览器创建一个会话对象(session对象),并且为每个session对象创建一个Jsessionid号。当session对象创建成功后,会以cookie的方式将这个Jsessionid号回写给浏览器,当用户再次进行访问服务器时,及带了具有Jsessionid号的cookie数据来一起访问服务器,服务器通过不同session的 Jsessionid号来找出与其相关联的session对象,通过不同的session对象来为不同的用户服务。

使用

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

  • 数据库(默认)
  • 缓存
  • 文件
  • 缓存+数据库
  • 加密cookie

数据库Session

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_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,默认修改之后才保存(默认)
 
 
 
b. 使用
 
  def index(request):
    # 获取、设置、删除Session中数据
    request.session['k1']
    request.session.get('k1',None)
    request.session['k1'] = 123
    request.session.setdefault('k1',123) # 存在则不设置
    del request.session['k1']
 
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()

 # 3.0无下面3个方法
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()
 
 
    # 用户session的随机字符串
    request.session.session_key
 
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
 
    # 检查 用户session的随机字符串 在数据库中是否
    request.session.exists("session_key")
 
    # 删除当前用户的所有Session数据
    request.session.delete("session_key")
    request.session.delete()
    request.session.flush()
 
    request.session.set_expiry(value)
      * 如果value是个整数,session会在些秒数后失效。
      * 如果value是个datatime或timedelta,session就会在这个时间后失效。
      * 如果value是0,用户关闭浏览器session就会失效。
      * 如果value是None,session会依赖全局session失效策略。

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

b. 使用

同上

文件Session

a. 配置 settings.py

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

b. 使用

同上

缓存+数据库Session

数据库用于做持久化,缓存用于提高效率

a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎

b. 使用

同上

加密cookie Session

a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎

b. 使用

同上

登录状态验证

def login_status(func):
  def warp(request,*args,**kwargs):
    user = request.session.get("username")
    if user:
      kwargs["username"] = user
      return func(request,*args,**kwargs)
    return redirect(login)
  return warp

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Django的URLconf中使用命名组的方法
Jul 18 Python
Python自动生产表情包
Mar 17 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
Window 64位下python3.6.2环境搭建图文教程
Sep 19 Python
python selenium firefox使用详解
Feb 26 Python
Python学习笔记之自定义函数用法详解
Jun 08 Python
python3 写一个WAV音频文件播放器的代码
Sep 27 Python
OpenCV Python实现拼图小游戏
Mar 23 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
pandas中DataFrame检测重复值的实现
May 26 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 Python
python通过新建环境安装tfx的问题
May 20 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 #Python
Python退出时强制运行一段代码的实现方法
Apr 29 #Python
pyinstaller将含有多个py文件的python程序做成exe
Apr 29 #Python
如何使用python切换hosts文件
Apr 29 #Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 #Python
Python 实现一行输入多个数字(用空格隔开)
Apr 29 #Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 #Python
You might like
PHP实现服务器状态监控的方法
2014/12/09 PHP
php通过排列组合实现1到9数字相加都等于20的方法
2015/08/03 PHP
PHP+jQuery实现即点即改功能示例
2019/02/21 PHP
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
JavaScript闭包详解
2015/02/02 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
jquery实现两边飘浮可关闭的对联广告
2015/11/27 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
[02:42]2014DOTA2国际邀请赛 三冰专访:我会打到Ti20
2014/07/13 DOTA
python中精确输出JSON浮点数的方法
2014/04/18 Python
Python AES加密模块用法分析
2017/05/22 Python
python如何通过实例方法名字调用方法
2018/03/21 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
django页面跳转问题及注意事项
2019/07/18 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
CAT鞋加拿大官网:CAT Footwear加拿大
2020/08/05 全球购物
迎接领导欢迎词
2014/01/11 职场文书
《藤野先生》教学反思
2014/02/19 职场文书
三年级学生评语
2014/04/23 职场文书
2014年乡镇妇联工作总结
2014/12/02 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
总经理助理岗位职责
2015/01/31 职场文书
2015年推普周活动方案
2015/05/06 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
python办公自动化之excel的操作
2021/05/23 Python
多台电脑共享文件怎么设置?多台电脑共享文件操作教程
2022/04/08 数码科技
MySQL数据库事务的四大特性
2022/04/20 MySQL
Java获取字符串编码格式实现思路
2022/09/23 Java/Android