会话控制 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中