Django基础之Session
1. Session的由来
Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且它保存在服务器,有较高的安全性。这就是Session。
问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”,那么上述的Cookie就起到桥接的作用。
我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号,密码等”。
总而言之:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”,但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息,以及超过4095字节的文本。
另外,上述所说的Cookie和Session其实是共通的东西,不限于语言和框架。
2. Django中Session相关方法
2.1 获取、设置、删除Session中数据
# 获取session值
request.session["k1"] # 获取session值
request.session.get("k1", None) # 设置Session
request.session["k1"] = 123 # 为session设置默认值
request.session.setdefault("k1", 123) # 删除Session中的数据
del request.session["k1"]
2.2 所有键,值,键值对
# session中的所有键
request.session.keys() # session中的所有值
request.session.values() # session中的所有键值对
request.session.items() # session中的可迭代的键
request.session.iterkeys() # session中的可迭代的值
request.session.itervalues() # session中的可迭代键值对
request.session.iteritems()
2.3 会话session的key
request.session.session_key
2.4 将所有session失效日期小于当前日期的数据删除
request.session.clear_expired()
2.5 检查会话session的key在数据库中是否存在
request.session.exists("session_key")
2.6 删除当前会话的所有session数据
request.session.delete()
2.7 删除当前的会话数据并删除会话的Cookie
request.session.flush()
这用于确保前面的会话数据不可以再次被用户的浏览器访问。
例如:django.contrib.auth.logout()函数中就会调用它。
2.8 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
- 如果value是个整数,session会在value秒后失效。
- 如果value是个datetime或timedelta,session就会在这个时间后失效。
- 如果value是0,用户关闭浏览器session就会失效
- 如果value是None,session会依赖全局session失效策略
3. Session流程解析

4. Django中的Session配置
Django中默认支持Sessin,其内部提供了5种类型的Session供开发者使用。
4.1 数据库Session
# 引擎(默认)
SESSION_ENGINE = "django.contrib.sessions.backends.db"
4.2 缓存Session
# 引擎
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
SESSION_CACHE_ALLAS = "default"
4.3 文件Session
# 引擎
SESSION_ENGINE = "django.contrib.sessions.backends.file"
# 缓存引擎路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
SESSION_FILE_PATH = None
4.4 缓存+数据库
# 引擎
SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
4.5 加密Cookie Session
# 引擎
SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
4.6 其他公用设置项
# session的cookie保存在浏览器上时的key, 即sessionid = 随机字符串(默认)
SESSION_COOKIE_NAME = "sessionid" # session的cookie保存的路径(默认)
SESSION_COOKIE_PATH = "/" # session的cookie保存的域名(默认)
SESSION_COOKIE_DOMAIN = None # 是否Https传输
SESSION_COOKIE_SECURE = True # 是否session的cookie只支持http传输(默认)
SESSION_COOKIE_HTTPONLY = True # session的cookie失效日期(2周)(默认)
SESSION_COOKIE_AGE = 1209600 # 是否关闭浏览器是的Session过期(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否每次请求都保存session,默认修改之后才保存(默认)
SESSION_SAVE_EVERY_REQUEST = False
Django基础之Session的更多相关文章
- Django基础之Session操作
1. 创建一个示例 1.1 第一步 首先创建一个django项目,创建app01, 连接数据库,做好准备工作. 然后在templates目录下创建两个html: login.html负责登录页面: b ...
- Django基础之Session版登录验证
from functools import wraps def check_login(func): @wraps(func) def inner(request, *args, **kwargs): ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- Django基础cookie和session
Django基础cookie和session 1.会话跟踪 什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如给10086打个电话,你就是客户端, ...
- day 62.3 Django基础八之cookie和session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx ...
- day 73 Django基础八之cookie和session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 x ...
- Django基础六之cookie和session
Django基础六之cookie和session 目录 Django基础六之cookie和session 1. cookie和session介绍 1.1 cookie 简介 1.2 cookie的缺陷 ...
- django基础 -- 8.cookie 和 session
一. cookie 1.cookie 的原理 工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容, 浏览器收到相应后保存在本地:当浏览器再次访问时,浏览器会自动带上Cooki ...
- Django基础八之cookie和session
一 会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器 ...
随机推荐
- 怎样获取所有的embed节点对象
<embed>是H5中新增的标签, 可以通过: document.embeds 和 document.plugins 获取所有的 embed 节点 document.embeds === ...
- iOS 定义多个参数函数的写法
多个参数的写法 (方法的数据类型)函数名:(参数1数据类型)参数1的数值的名字 参数2的名字: (参数2数据类型) 参数2值的名字 …. ; 如 : 有三个参数 -(void)getdetailI ...
- Oracle对字段去重查询所有字段数据
单个字段: select distinct(a) from tableA; 多个字段,利用max()去重 SELECT * FROM GM_PPU_RESIDENT_NORBASE g WHE ...
- 第七章、Ajango自带auth模块
目录 第七章.Ajango自带auth模块 一.什么是auth auth是django自带的用户认证模块 二.auth模块的常用方法 三.拓展默认的auth_user表 第七章.Ajango自带aut ...
- Windows Phone惨遭微软放弃
微软在电脑操作系统上的用户保有量一直处于遥遥领先的地位,特别是最新的Windows 10系统,一经推出,市场表现就比较好,但相比起来,微软的手机操作系统Windows Phone就被贴上“差等生”的标 ...
- SPI总线的原理与Verilog实现
转载地址:https://www.cnblogs.com/liujinggang/p/9609739.html 一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件 ...
- java——double数据精度问题
代码:使用BigDecimal来代替double public class BigDecimalUtil { public static BigDecimal add(double v1,double ...
- Ping-Pong (Easy Version)的解析
原题链接:http://codeforces.com/problemset/problem/320/B 之前自己做的时候一直读不懂题意,看了大佬的博客才知道是用dfs写,一道暴力搜索大水题https: ...
- mysql中的分区
第18章:分区 目录 18.1. MySQL中的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. KEY分区 ...
- P2402 奶牛隐藏 二分+网络流
floyd搞出两点间最短距离 二分判答案 // luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; ty ...