一、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
实例
代码语言:javascript复制<span class="hljs-comment"># 设置cookie</span>
<span class="hljs-meta">@app.route('/set_cookie/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_cookie</span><span class="hljs-params">()</span>:</span>
res = make_response(<span class="hljs-string">'cookie已设置'</span>)
<span class="hljs-comment"># 设置cookie</span>
res.set_cookie(<span class="hljs-string">'name'</span>, <span class="hljs-string">'lucky'</span>)
<span class="hljs-keyword">return</span> res
注意:
不设置过期时间 默认存活为浏览会话结束 也就是关闭浏览器 而不是关闭标签页
获取cookie
代码语言:javascript复制<span class="hljs-comment"># 获取cookie</span>
<span class="hljs-meta">@app.route('/get_cookie/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_cookie</span><span class="hljs-params">()</span>:</span>
<span class="hljs-keyword">return</span> request.cookies.get(<span class="hljs-string">'name'</span>) <span class="hljs-keyword">or</span> <span class="hljs-string">'不存在'</span>
移除cookie
代码语言:javascript复制<span class="hljs-meta">@axf.route("/deleteCookie/")</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">deleteCookie</span><span class="hljs-params">()</span>:</span>
response = make_response(<span class="hljs-string">"删除名为lucky的cookie"</span>)
<span class="hljs-comment">#response.set_cookie('name','',expires=0) </span>
<span class="hljs-comment"># 键</span>
response.delete_cookie(<span class="hljs-string">"name"</span>)
<span class="hljs-keyword">return</span> response
设置cookie并设置过期时间
代码语言:javascript复制<span class="hljs-comment"># 设置cookie</span>
<span class="hljs-meta">@app.route('/set_cookie/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_cookie</span><span class="hljs-params">()</span>:</span>
resp = make_response(<span class="hljs-string">'cookie已设置'</span>)
<span class="hljs-comment"># 设置cookie,可以指定过期时间 下面均为10秒后过期s</span>
expires = time.time() <span class="hljs-number">10</span>
resp.set_cookie(<span class="hljs-string">'name'</span>, <span class="hljs-string">'lucky'</span>, expires=expires)
<span class="hljs-comment">#resp.set_cookie('name', 'lucky', max_age=10)</span>
<span class="hljs-keyword">return</span> resp
二、session
概述
- 服务器需要识别来自同一访问者的请求。这主要是通过浏览的cookie实现的。 访问者在第一次访问服务器时,服务器在其cookie中设置一个唯一的ID号——会话ID。 这样,访问者后续对服务器的访问头中将自动包含该信息,服务器通过这个ID号,即可区 隔不同的访问者。
- Flask框架中,每当一个请求进来时会自动根据请求中cookie的会话ID创建 一个Session类的实例对象(会话ID的键 默认为session)
缓存共同配置
代码语言:javascript复制<span class="hljs-comment"># session是否长期有效,如果为False则关闭浏览器session失效</span>
SESSION_PERMANENT = <span class="hljs-keyword">True</span>
<span class="hljs-comment"># session长期有效,则设定session的生命周期,单位是秒</span>
PERMANENT_SESSION_LIFETIME = <span class="hljs-number">60</span> * <span class="hljs-number">60</span> * <span class="hljs-number">24</span> * <span class="hljs-number">14</span>
<span class="hljs-comment"># 是否强制加盐(密)混淆session(是否对发送到浏览器上的session的cookie值进行加密)</span>
SESSION_USE_SIGNER = <span class="hljs-keyword">True</span>
<span class="hljs-comment"># 如果加盐须设置安全码 必须设置否则报错</span>
SECRET_KEY = str(uuid.uuid4())
本地缓存
代码语言:javascript复制<span class="hljs-comment"># session存储模式</span>
SESSION_TYPE = <span class="hljs-string">"null"</span>
如果作为测试都写在一个文件中 也可以进行下面写法
代码语言:javascript复制app.secret_key = <span class="hljs-string">'sth. random as a encrypt key.'</span>
或者
app.config[<span class="hljs-string">'SECRET_KEY'</span>] = <span class="hljs-string">'sth. random as a encrypt key.'</span>
<span class="hljs-string">"""
config:是一个字典的一个子类,能像字典一样被修改
注意:配置的选项必须大写
"""</span>
存储在redis
安装
pip install redis
pip install flask-session
配置文件中导入
from redis import Redis
配置
代码语言:javascript复制<span class="hljs-comment"># session存储模式</span>
SESSION_TYPE = <span class="hljs-string">"redis"</span>
<span class="hljs-comment"># 存储到redis中键的前缀</span>
SESSION_KEY_PREFIX = <span class="hljs-string">"session:"</span>
<span class="hljs-comment">#redis服务器配置,默认使用0库</span>
SESSION_REDIS = Redis(
host=<span class="hljs-string">"127.0.0.1"</span>,
port=<span class="hljs-string">"6379"</span>,
password=<span class="hljs-string">"123456"</span>
)
创建三方对象
exts/sess.py
代码语言:javascript复制<span class="hljs-keyword">from</span> flask_session <span class="hljs-keyword">import</span> Session
sess = Session()
exts/__init__.py
代码语言:javascript复制<span class="hljs-keyword">from</span> exts.sess <span class="hljs-keyword">import</span> sess
app加载三方对象
代码语言:javascript复制<span class="hljs-keyword">from</span> exts <span class="hljs-keyword">import</span> sess
sess.init_app(app)
存储在 数据库
配置
代码语言:javascript复制<span class="hljs-comment"># session存储模式</span>
SESSION_TYPE = <span class="hljs-string">"sqlalchemy"</span>
<span class="hljs-comment">#操作数据的对象</span>
SESSION_SQLALCHEMY = db
<span class="hljs-comment">#数据库中使用的表名</span>
SESSION_SQLALCHEMY_TABLE = <span class="hljs-string">"session"</span>
设置session
在视图函数内,Flask提供了一个全局对象session,它始终等效于当前请求所对应的 Session类实例对象。Session类定义了get_item()方法和set_item()方法, 因此我们可以像使用Dict对象一样,通过[]操作符读取或设置会话变量
代码语言:javascript复制<span class="hljs-keyword">from</span> flask <span class="hljs-keyword">import</span> session
<span class="hljs-comment"># 设置session</span>
<span class="hljs-meta">@app.route('/set_session/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_session</span><span class="hljs-params">()</span>:</span>
session[<span class="hljs-string">'name'</span>] = <span class="hljs-string">'lucky'</span>
<span class="hljs-keyword">return</span> <span class="hljs-string">'设置session'</span>
设置session及过期时间
timedalte 是datetime中的一个对象,该对象表示两个时间的差值
构造函数:datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
代码语言:javascript复制<span class="hljs-meta">@app.route('/set_session_lifetime/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">set_session_lifetime</span><span class="hljs-params">()</span>:</span>
<span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> timedelta
session.permanent = <span class="hljs-keyword">True</span> <span class="hljs-comment"># 持久化</span>
app = current_app._get_current_object() <span class="hljs-comment">#获取实例化的flask对象app</span>
app.permanent_session_lifetime = timedelta(minutes=<span class="hljs-number">5</span>)
session[<span class="hljs-string">'age'</span>] = <span class="hljs-number">18</span>
<span class="hljs-keyword">return</span> <span class="hljs-string">'设置session及过期时间'</span>
获取session
代码语言:javascript复制<span class="hljs-comment"># 获取session</span>
<span class="hljs-meta">@app.route('/get_session/')</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_session</span><span class="hljs-params">()</span>:</span>
<span class="hljs-keyword">return</span> session.get(<span class="hljs-string">'name'</span>, <span class="hljs-string">'who are you ?'</span>)
删除session
代码语言:javascript复制<span class="hljs-meta">@app.route("/delete_session/")</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">delete_session</span><span class="hljs-params">()</span>:</span>
<span class="hljs-comment"># 删除名为nice的session</span>
session.pop(<span class="hljs-string">"name"</span>, <span class="hljs-keyword">None</span>)
<span class="hljs-comment"># 移除所有session</span>
<span class="hljs-comment"># session.clear()</span>
<span class="hljs-keyword">return</span> <span class="hljs-string">"删除session"</span>
三、cookie 和session 的区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 ,考虑到安全应当使用session
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能 考虑到减轻服务器性能方面,应当使用COOKIE
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie
- 所以个人建议 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在COOKIE中