Django学习之Session

1>介绍

     cookie看似解决了HTTP(短连接、无状态)的会话保持问题,但把全部用户数据保存在客户端,

     存在安全隐患,于是cookie+session出现了!我们可以把关于用户的数据保存在服务端,

     在客户端cookie里加一个sessionID(随机字符串),服务端通过校验这个sessionID来处理后续操作,

     用户的隐秘信息便不会在请求的时候传来传去,是否安全多了呢。

    Session是服务器端技术,利用这个技术,服务器在运行时可以 为每一个用户的浏览器创建一个其独享

    的session对象,由于 session为用户浏览器独享,所以用户在访问服务器的web资源时 ,可以把各

    自的数据放在各自的session中,当用户再去访问该服务器中的其它web资源时,其它web资源再从

    用户各自的session中 取出数据为用户服务。

     cookie+session的工作流程:

     (1)、当用户来访问服务端时,服务端生成一个随机字符串;

     (2)、当用户登录成功后 把 {sessionID :随机字符串} 组织成键值对 加到 cookie里发送给用户;

     (3)、服务器以发送给客户端 cookie中的随机字符串做键,用户信息做值,保存到数据库,django_session表;

2>用法

   先看下一些基本的语法

 1、设置Sessions值 request.session['session_name'="admin"

 2、获取Sessions值 session_name = request.session["session_name"]

 3、删除Sessions值 del request.session["session_name"](不建议使用,会留下cookie)

 4、flush() 删除当前的会话数据并删除会话的Cookie。(建议使用,彻底删除,cookie也删,不留任何痕迹)

    基于之前session登陆验证的例子,用session改写一下,如下

   Django学习之Session

   Django学习之Session

Django学习之Session

session取值

Django学习之Session

Django学习之Session

对应server端针对请求生成cookie的三步:1、生成随机字符串;2、sessionid和随机字符串组成键值,放入cookie返回给

客户端;3、django_session表中同步记录 随机字符串和用户信息的键值对,存储在表中。

响应用户取值也有三步:1、先从cookie中通过sessionid获取 随机字符串;2、在django_session表中过滤出session_key

等于随机字符串的一条记录;3、从这条记录的session_data中取出对应的数据,服务客户端。

再看下两种删除session的方式

Django学习之Session

Django学习之Session

Django学习之Session

Django学习之Session

3>session相关的配置

    SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

    SESSION_COOKIE_NAME = "sessionid"     # Session的cookie保存在浏览器上时的key的名称

    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,默认修改之后才保存(默认)

    解释下 SESSION_SAVE_EVERY_REQUEST,比如设置session过期时间为10s,当默认值为False的时候,固定10秒后

 session失效,当这个值为True,只要你在10秒内有访问请求,失效时间就会再往后延10秒,就是这个10是从最新

 的一次请求开始计算,若每个10秒内一直有请求,则session会一直保存,不会失效。

4>总结----cookie和session

   借张图来说明下

  Django学习之Session

   4.1>客户端首次发送请求,登陆成功后,服务端会先生成一个session id,也就是一个随机字符串;

   4.2>服务端把sessionid和随机字符串组成键值对,放入cookie传送给客户端;

   4.3>服务端这边同步以 随机字符串 和用户信息数据组成键值对,存入数据库,也就是django-session表中;

   4.4>客户端再次发送请求,cookie里面会带之前服务端相应的session键值对;

   4.5>服务端根据sessionid的值,也就是随机字符串去数据库中,查找对应的记录;

   4.6>根据找到的记录,取出session_data里面的值,供客户使用。

Django学习之Session