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 相关文章推荐
python 自动提交和抓取网页
Jul 13 Python
python简单猜数游戏实例
Jul 09 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
Python使用微信SDK实现的微信支付功能示例
Jun 30 Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 Python
详解Python的三种可变参数
May 08 Python
pyqt5 获取显示器的分辨率的方法
Jun 18 Python
Python使用matplotlib实现交换式图形显示功能示例
Sep 06 Python
Flask框架请求钩子与request请求对象用法实例分析
Nov 07 Python
Python经典五人分鱼实例讲解
Jan 04 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里的JS打印函数
2006/10/09 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
PHP 文件上传限制问题
2019/09/01 PHP
javascript数组快速打乱重排的方法
2014/01/02 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
原生JavaScript实现滚动条效果
2020/03/24 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
js中数组常用方法总结(推荐)
2019/04/09 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
Python获取远程文件大小的函数代码分享
2014/05/13 Python
浅谈Python中函数的参数传递
2016/06/21 Python
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
TensorFlow实现模型评估
2018/09/07 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
法国时尚童装网站:Melijoe
2016/08/10 全球购物
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
德国婴儿服装和婴儿用品购买网站:Baby Sweets
2019/12/08 全球购物
单位介绍信范文
2014/01/18 职场文书
乡镇纠风工作实施方案
2014/03/22 职场文书
合伙经营协议书
2014/04/18 职场文书
保护水资源的标语
2014/06/17 职场文书