• 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
    

      

  • 相关阅读:
    javascript游戏引擎
    BI 可视化
    nodeJS 相关开源项目
    bean validation 技术规范
    JForum 源码分析
    lemon OA 我长时间经历的第一个开源项目
    Rete算法
    摘自知乎--mysql
    copy and paste ,做到这样也很牛逼了
    servlet 3.0特性说明
  • 原文地址:https://www.cnblogs.com/yang-wei/p/9998121.html
Copyright © 2020-2023  润新知