阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

会话控制 COOKIE 与 SESSION

236次阅读
没有评论

共计 3423 个字符,预计需要花费 9 分钟才能阅读完成。

一、COOKIE

  • 概述

    会话控制 用来保持用户的状态 具体来说 cookie 机制采用的是在客户端保持状态的方案,而 session 机制采用的是在服务器端保持状态的方案

  • 原因

    http 协议时无状态的

    每一次请求都是一次新的请求,不会记得之前的通信状态

  • 值的存储

    cookie 存储在客户端的浏览器 一般会限制存储 cookie 的个数为 20 个 并且单个 cookie 保存值的大小不能超过 4kb 存储在浏览器上为明文存储 所以不安全

  • 设置 cookie

    格式

    Response.set_cookie()

    参数:

    • key cookie 的键
    • value cookie 的值
    • max_age 秒为单位的 cookie 寿命 None 表示浏览器关闭时
    • expires 失效时间 datetime 对象或 unix 时间戳
    • path 生效的路径
    • domain 生效的域名
    • secure HTTPS 传输时应设置为 true
    • httponly 仅 http 传输 不能使用 js 获取 cookie

    实例

    # 设置 cookie
    @app.route('/set_cookie/')
    def set_cookie():
    res = make_response('cookie 已设置')
    # 设置 cookie
    res.set_cookie('name', 'lucky')
    return res

    注意:

    不设置过期时间 默认存活为浏览会话结束 也就是关闭浏览器 而不是关闭标签页

  • 获取 cookie

    # 获取 cookie
    @app.route('/get_cookie/')
    def get_cookie():
    return request.cookies.get('name') or '不存在'
  • 移除 cookie

    @axf.route("/deleteCookie/")
    def deleteCookie():
    response = make_response("删除名为 lucky 的 cookie")
    #response.set_cookie('name','',expires=0)
    # 键
    response.delete_cookie("name")
    return response
  • 设置 cookie 并设置过期时间

    # 设置 cookie
    @app.route('/set_cookie/')
    def set_cookie():
    resp = make_response('cookie 已设置')
    # 设置 cookie,可以指定过期时间 下面均为 10 秒后过期 s
    expires = time.time() + 10
    resp.set_cookie('name', 'lucky', expires=expires)
    #resp.set_cookie('name', 'lucky', max_age=10)
    return resp

二、session

  • 概述

    • 服务器需要识别来自同一访问者的请求。这主要是通过浏览的 cookie 实现的。访问者在第一次访问服务器时,服务器在其 cookie 中设置一个唯一的 ID 号——会话 ID。这样,访问者后续对服务器的访问头中将自动包含该信息,服务器通过这个 ID 号,即可区 隔不同的访问者。

    • Flask 框架中,每当一个请求进来时会自动根据请求中 cookie 的会话 ID 创建 一个 Session 类的实例对象(会话 ID 的键 默认为session

  • 缓存共同配置

    # session 是否长期有效,如果为 False 则关闭浏览器 session 失效
    SESSION_PERMANENT = True
    # session 长期有效,则设定 session 的生命周期,单位是秒
    PERMANENT_SESSION_LIFETIME = 60 * 60 * 24 * 14
    # 是否强制加盐 (密) 混淆 session(是否对发送到浏览器上的 session 的 cookie 值进行加密)
    SESSION_USE_SIGNER = True
    # 如果加盐须设置安全码 必须设置否则报错
    SECRET_KEY = str(uuid.uuid4())
  • 本地缓存

    # session 存储模式
    SESSION_TYPE = "null"

    如果作为测试都写在一个文件中 也可以进行下面写法

    app.secret_key = 'sth. random as a encrypt key.'
    或者
    app.config['SECRET_KEY'] = 'sth. random as a encrypt key.'
    """
    config:是一个字典的一个子类,能像字典一样被修改
    注意:配置的选项必须大写
    """
  • 存储在 redis

    • 安装

      pip install redis

      pip install flask-session

    • 配置文件中导入

      from redis import Redis

    • 配置

      # session 存储模式
      SESSION_TYPE = "redis"
      # 存储到 redis 中键的前缀
      SESSION_KEY_PREFIX = "session:"
      #redis 服务器配置,默认使用 0 库
      SESSION_REDIS = Redis(host="127.0.0.1",
      port="6379",
      password="123456"
      )
    • 创建三方对象

      exts/sess.py

      from flask_session import Session
      sess = Session()

      exts/__init__.py

      from exts.sess import sess
      
    • app 加载三方对象

      from exts import sess
      sess.init_app(app)
  • 存储在 数据库

    配置

    # session 存储模式
    SESSION_TYPE = "sqlalchemy"
    # 操作数据的对象
    SESSION_SQLALCHEMY = db
    # 数据库中使用的表名
    SESSION_SQLALCHEMY_TABLE = "session"
  • 设置 session

    在视图函数内,Flask 提供了一个全局对象 session,它始终等效于当前请求所对应的 Session 类实例对象。Session 类定义了 get_item()方法和 set_item()方法,因此我们可以像使用 Dict 对象一样,通过 [] 操作符读取或设置会话变量

    from flask import session
    # 设置 session
    @app.route('/set_session/')
    def set_session():
    session['name'] = 'lucky'
    return '设置 session'
  • 设置 session 及过期时间

    timedalte 是 datetime 中的一个对象,该对象表示两个时间的差值

    构造函数:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

    @app.route('/set_session_lifetime/')
    def set_session_lifetime():
    from datetime import timedelta
    session.permanent = True # 持久化
    app = current_app._get_current_object() # 获取实例化的 flask 对象 app
    app.permanent_session_lifetime = timedelta(minutes=5)
    session['age'] = 18
    return '设置 session 及过期时间'
  • 获取 session

    # 获取 session
    @app.route('/get_session/')
    def get_session():
    return session.get('name', 'who are you ?')
  • 删除 session

    @app.route("/delete_session/")
    def delete_session():
    # 删除名为 nice 的 session
    session.pop("name", None)
    # 移除所有 session
    # session.clear()
    return "删除 session"

三、cookie 和 session 的区别

  • cookie 数据存放在客户的浏览器上,session 数据放在服务器上。

  • cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session

  • session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能

    考虑到减轻服务器性能方面,应当使用 COOKIE

  • 单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie

  • 所以个人建议

    将登陆信息等重要信息存放为 SESSION
    其他信息如果需要保留,可以放在 COOKIE 中

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-05-26发表,共计3423字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中