共计 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 中