概述
会话控制 用来保持用户的状态 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案
原因
http协议时无状态的
每一次请求都是一次新的请求,不会记得之前的通信状态
值的存储
cookie存储在客户端的浏览器 一般会限制存储cookie的个数为 20个 并且单个cookie保存值的大小不能超过4kb 存储在浏览器上为明文存储 所以不安全
设置cookie
格式
Response.set_cookie()
参数:
实例
<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
<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
<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并设置过期时间
<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
概述
缓存共同配置
<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())
本地缓存
<span class="hljs-comment"># session存储模式</span>
SESSION_TYPE = <span class="hljs-string">"null"</span>
如果作为测试都写在一个文件中 也可以进行下面写法
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
配置
<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
<span class="hljs-keyword">from</span> flask_session <span class="hljs-keyword">import</span> Session
sess = Session()
exts/__init__.py
<span class="hljs-keyword">from</span> exts.sess <span class="hljs-keyword">import</span> sess
app加载三方对象
<span class="hljs-keyword">from</span> exts <span class="hljs-keyword">import</span> sess
sess.init_app(app)
存储在 数据库
配置
<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对象一样,通过[]操作符读取或设置会话变量
<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)
<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
<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
<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>
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有