组团学

会话控制 COOKIE 与 SESSION

阅读 (200725)

一、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中

需要 登录 才可以提问哦