Bonky Zhu
If someone is able to show me that what I think or do is not right, I will happily change, for I seek the truth, by which no one was ever truly harmed. It is the person who continues in his self-deception and ignorance who is harmed.

Django之session

Session是服务器端为了保存某些数据,或实现某些必要的功能,当用户访问服务器时,将数据临时保存在服务器端以供完成服务器端的其他某些功能。服务器需要保存的数据可以以cookie的方式存储在客户端,而session的功能就是将服务器需要保存的数据存储在服务端。例如账号登录记录的功能,可以以session的方式将登录状态保存在服务器端,这样当用户访问其他程序时,需要用到登录的地方,都可以从该用户的session中取出该用户的数据,为用户服务。

session和cookie的区别

session的底层是基于cookie技术来实现的,当用户打开浏览器,去访问服务器的时候,服务器会为每个用户的浏览器创建一个会话对象(session对象),并且为每个session对象创建一个Jsessionid号。当session对象创建成功后,会以cookie的方式将这个Jsessionid号回写给浏览器,当用户再次进行访问服务器时,及带了具有Jsessionid号的cookie数据来一起访问服务器,服务器通过不同session的 Jsessionid号来找出与其相关联的session对象,通过不同的session对象来为不同的用户服务。

img

在Django中session的使用方法

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

  • 数据库(默认):持久
  • 缓存:速度快
  • 文件:磁盘的 I/O 瓶颈问题,导致这种方案存储数据效率不是很高
  • 缓存+数据库:结合两者优点,但不过性能要求高
  • 加密cookie:适用于对数据保密性不严格的场景

配置 settings.py

    SESSION_ENGINE = 'django.contrib.sessions.backends.db'      # 引擎(默认)
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'   # 缓存
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'   # 数据库+缓存

    SESSION_ENGINE = 'django.contrib.sessions.backends.file'    #文件
        # 可选配置,如果为None则指定一个临时位置
        SESSION_FILE_PATH = '/monkey/www/'

    SESSION_ENGINE = 'jango.contrib.sessions.backends.signed_cookies'   #Cookie
        # 建议配置,阻止 javascript 对会话数据的访问,提高安全性。
        SESSION_COOKIE_HTTPONLY= True

使用

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()
    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.clear()

    request.session.set_expiry(value)
    '''
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。
    '''

参考资料

  1. 在Django中Session的那点事!

  2. Django 使用会话( sessions )功能

Share

You may also like...

发表评论