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的更多相关文章

  1. Django基础之Session操作

    1. 创建一个示例 1.1 第一步 首先创建一个django项目,创建app01, 连接数据库,做好准备工作. 然后在templates目录下创建两个html: login.html负责登录页面: b ...

  2. Django基础之Session版登录验证

    from functools import wraps def check_login(func): @wraps(func) def inner(request, *args, **kwargs): ...

  3. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  4. Django基础cookie和session

    Django基础cookie和session 1.会话跟踪 ​ 什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如给10086打个电话,你就是客户端, ...

  5. day 62.3 Django基础八之cookie和session

    Django基础八之cookie和session   本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx ...

  6. day 73 Django基础八之cookie和session

      Django基础八之cookie和session   本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 x ...

  7. Django基础六之cookie和session

    Django基础六之cookie和session 目录 Django基础六之cookie和session 1. cookie和session介绍 1.1 cookie 简介 1.2 cookie的缺陷 ...

  8. django基础 -- 8.cookie 和 session

    一. cookie 1.cookie 的原理 工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容, 浏览器收到相应后保存在本地:当浏览器再次访问时,浏览器会自动带上Cooki ...

  9. Django基础八之cookie和session

    一 会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器 ...

随机推荐

  1. c++11 常量表达式

    c++11 常量表达式 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #inclu ...

  2. QT开发小技巧-窗口处理(一)

    this->setWindowFlags(Qt::WindowCloseButtonHint); // 仅保留关闭按钮 this->setAttribute(Qt::WA_DeleteOn ...

  3. git遇到的问题记录2019.05.07

    用sourcetree拉取代码,报错如下: error: cannot lock ref 'refs/remotes/origin/my_branch': unable to resolve refe ...

  4. 从零开始使用mocha测试

    mocha 需要在node环境下跑,请确保已经安装了node   1.新建一个文件夹 test   2.命令行切换到test目录下,执行命令:npm init ,出现选择按enter,一系列选择完成之 ...

  5. asp.net mvc5 DataBase First下model校验问题(MetadataType使用)

    最近学习asp.net mvc5,使用   asp.net mvc5+EF6+AutoFac做个小Demo,其中是先设计的数据库表,就直接选择了EF的DataBase First(三种开发模式分别是c ...

  6. JPA的API介绍、工具类抽取

    1.Persistence对象 Persistence对象主要作用是用于获取EntityManagerFactory对象的 .通过调用该类的createEntityManagerFactory静态方法 ...

  7. 多进程编程——理论讲解与 multiprocessing 模块

    多进程编程 import os pid = os .fork() 功能 :创建新的进程 参数: 无 返回值 :失败返回一个负数 成功:在原有进程中返回新的进程的PID号 在新进程中返回为0* 子进程会 ...

  8. Hadoop_33_Hadoop HA的搭建

    Hadoop HA的搭建,可参考链接:https://blog.csdn.net/mrbcy/article/details/64939623 说明:    1.在hadoop2.0中通常由两个Nam ...

  9. u-boot移植易用性设置

    u-boot移植易用性设置 以下设置使用的u-boot版本为u-boot-2012.04.01 环境参数 在Flash上划分了一块区域用于存储环境变量,所以当u-boot启动时会有如下操作: 读取Fl ...

  10. C语言根据结构体成员变量的地址,得到结构体的地址

    看nginx代码时发现双链表使用的是这种方法,记录一下 给出一个实例来说明 struct father_t {    int a;    char *b;    double c;}f;char *p ...