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中实现常量(Const)功能
Jan 28 Python
在Python中处理字符串之isdecimal()方法的使用
May 20 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
django 解决自定义序列化返回处理数据为null的问题
May 20 Python
tensorflow模型转ncnn的操作方式
May 25 Python
Python如何读写二进制数组数据
Aug 01 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
python 如何执行控制台命令与操作剪切板
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
ajax php 实现写入数据库
2009/09/02 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
php实现文件上传基本验证
2020/03/04 PHP
学习YUI.Ext基础第一天
2007/03/10 Javascript
悬浮数字的实现案例
2014/02/19 Javascript
利用JavaScript检测CPU使用率自己写的
2014/03/22 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
常用的JavaScript模板引擎介绍
2015/02/28 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
Python3基础之基本数据类型概述
2014/08/13 Python
Python模仿POST提交HTTP数据及使用Cookie值的方法
2014/11/10 Python
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
分析Python中解析构建数据知识
2018/01/20 Python
python解析含有重复key的json方法
2019/01/22 Python
微信小程序python用户认证的实现
2019/07/29 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
如何在Anaconda中打开python自带idle
2020/09/21 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
python re模块常见用法例举
2021/03/01 Python
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
法学研究生自我鉴定范文
2013/12/04 职场文书
人事部岗位职责范本
2014/03/05 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript