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编写一个在Linux下实现截图分享的脚本的教程
Apr 24 Python
Python制作简单的网页爬虫
Nov 22 Python
Pyhton中单行和多行注释的使用方法及规范
Oct 11 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
机器学习经典算法-logistic回归代码详解
Dec 22 Python
分享Python切分字符串的一个不错方法
Dec 14 Python
python实现登录密码重置简易操作代码
Aug 14 Python
线程安全及Python中的GIL原理分析
Oct 29 Python
pygame实现俄罗斯方块游戏(基础篇1)
Oct 29 Python
Python sep参数使用方法详解
Feb 12 Python
如何使用python切换hosts文件
Apr 29 Python
Python Django ORM连表正反操作技巧
Jun 13 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
用 php 编写的日历
2006/10/09 PHP
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
第五章 php数组操作
2011/12/30 PHP
php版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
2015/11/20 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
微信小程序页面传值实例分析
2017/04/19 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
js实现双色球效果
2020/08/02 Javascript
python模块之StringIO使用示例
2015/04/08 Python
在Django中进行用户注册和邮箱验证的方法
2016/05/09 Python
python中import学习备忘笔记
2017/01/24 Python
Python中扩展包的安装方法详解
2017/06/14 Python
python中文分词,使用结巴分词对python进行分词(实例讲解)
2017/11/14 Python
Python3简单实例计算同花的概率代码
2017/12/06 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
Tensorflow tensor 数学运算和逻辑运算方式
2020/06/30 Python
python实现PolynomialFeatures多项式的方法
2021/01/06 Python
无工作经验者个人求职信范文
2013/12/22 职场文书
店面销售职位的职责
2014/03/09 职场文书
运动会开幕式主持词
2014/03/28 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
导游词之西安骊山
2019/12/03 职场文书
详解如何用Python实现感知器算法
2021/06/18 Python