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

会话控制 COOKIE 与 SESSION

112次阅读
没有评论

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