4. 状态保持

HTTP协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态, 客户端与服务器端的一次通信,就是一次会话, 会话结束,就都忘了,HTTP是严重老年痴呆患者。

有时候通讯必须要保持状态,知道你上次来访的结果等,就需要一种特殊的方式能够记住上次 来访信息实现状态保持。实现的方式一般是在客户端或服务器端存储与会话有关的数据。

  • 用来存储信息的方式包括cookie、session
  • 会话一般指session对象,session存放在服务器端,
  • 也可以使用cookie,所有数据存储在客户端,cookie一般不保存重要信息
  • 或者同时使用。
  • 推荐使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id
  • 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
注意:不同的请求者之间不会共享这个数据,与请求者一一对应

4.1. 开启session

  • 使用django-admin startproject创建的项目默认启用
  • 禁用会话:删除下面指定的两个值,禁用会话将节省一些性能消耗
Django 中session需要依赖数据库,因此需要确认数据库中是否存在与session相关的表

settings.py文件中设置:

  • INSTALLED_APPS列表中添加:

    'django.contrib.sessions',
    
  • MIDDLEWARE_CLASSES列表中添加:

       'django.contrib.sessions.middleware.SessionMiddleware',
    

4.2. 使用session

启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象

  • get(key, default=None):根据键获取会话的值

  • clear():清除所有会话

  • flush():删除当前的会话数据并删除会话的Cookie

  • del request.session[‘member_id’]:删除会话 示例:

      #session设置
       request.session[key] = value
    
      #session获取
       request.session.get(key,default=Node)
    
      #session删除
    
      # 删除单个key 不存在时报错
       del request.session['a'] 
    
      #清除所有会话,但不会删除数据
       request.session.clear() 
    
      #删除当前的会话数据
       request.session.flush()
    

4.3. session配置

session的一些属性可以通过配置文件进行配置, 常见的有生存时间,访问相关的属性等。

  • 在 settings.py 文件中进行设置:

      # session 设置 
      SESSION_COOKIE_AGE = 60 * 30 # 30分钟 
      SESSION_SAVE_EVERY_REQUEST = True #如果SESSION_SAVE_EVERY_REQUEST是True,会话cookie将在每个请求中发送
      SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 关闭浏览器,则COOKIE失效 
    
  • 以下设置为:10秒后过期

       # request.session['abc'] = 'abcdef'   
       # request.session.set_expiry(10)