Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >会话控制 COOKIE 与 SESSION

会话控制 COOKIE 与 SESSION

作者头像
星哥玩云
发布于 2022-09-14 10:47:30
发布于 2022-09-14 10:47:30
39100
代码可运行
举报
文章被收录于专栏:开源部署开源部署
运行总次数:0
代码可运行

一、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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-comment"># session存储模式</span>
SESSION_TYPE = <span class="hljs-string">"null"</span>

如果作为测试都写在一个文件中 也可以进行下面写法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">from</span> flask_session <span class="hljs-keyword">import</span> Session
sess = Session()

exts/__init__.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">from</span> exts.sess <span class="hljs-keyword">import</span> sess

app加载三方对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span class="hljs-keyword">from</span> exts <span class="hljs-keyword">import</span> sess
sess.init_app(app)

存储在 数据库

配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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
代码运行次数:0
运行
AI代码解释
复制
<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中
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
cookie操作
set_cookie(name, value, domain=None, expires=None, path=’/’, expires_days=None)
星哥玩云
2022/09/14
5160
cookie操作
视图的基本使用
响应内容可以为字符串数值等类型 一般用于测试 以后响应内容为渲染模板或json数据
星哥玩云
2022/09/14
5320
模板过滤器
过滤器是通过管道符号(|)进行使用的,例如:{{ name|length }},将返回name的长度。过滤器相当于是一个函数,把当前的变量传入到过滤器中,然后过滤器根据自己的功能,再返回相应的值,之后再将结果渲染到页面中
星哥玩云
2022/09/14
2500
模板的基本使用
一、概述 模板是HTML页面,可以根据传递的数据进行填充 二、模板存放目录 在工程下创建templates模板目录进行模板文件的存放 三、将templates标记为模板文件夹 如果使用的pycharm进行工程的创建 则templates已经选好为Jinja2模板引擎 如果为手动创建工程 则需手动选择模板引擎 选择templates->Mark Directory as -> Template Folder 选择Template language -> Jinja2 -> ok 四、定义模板 inde
星哥玩云
2022/09/14
6920
模板的基本使用
flask扩展 flask-celery
一、flask-celery安装 pip install celery pip install redis==2.10.6 pip install flask-celery-helper 二、创建和加载 工程目录下创建run_celery.py文件 <span class="hljs-comment">#定义创建celery对象的方法</span> <span class="hljs-keyword">from</span> celery <span class="hljs-keyword">import<
星哥玩云
2022/09/14
2700
点赞模块设计 - Redis缓存 + 定时写入数据库实现高性能点赞功能
源码地址:https://github.com/cachecats/coderiver
solocoder
2022/04/06
2.3K0
点赞模块设计 - Redis缓存 + 定时写入数据库实现高性能点赞功能
模板概述与变量
一、概述 说明 模板文件就是按照特定规则书写的一个负责展示效果的HTML文件;模板引擎就是提供特定规则的解释和替换的工具 Jinja2 在Flask中使用的就是该模板引擎,它是由flask核心开发组人员开发的 二、变量 目录结构 project/ manage.py <span class="hljs-comment"># 项目启动控制文件</span> templates/ <span class="hljs-comment"># 所有的模板文件</span> 渲染模板文件
星哥玩云
2022/09/14
4360
模型基本使用
python3.x使用的是pymysql模块,所以需要在project/__init.py文件中添加如上代码
星哥玩云
2022/09/14
2300
模型基本使用
增加数据到数据库
一、创建对象 当创建对象时DJango没有操作数据库读写,当调用save()方法时才与数据库进行交互,将对象保存到数据库 __init__()方法已经在models.Model类中进行了重写规定了特殊含义,所以在模型类中不能重写 二、增加方式 对象创建空对象后赋值 u = User() <span class="hljs-comment"># 实例化User模型类</span> u.username = <span class="hljs-string">'lucky'</span> <span clas
星哥玩云
2022/09/14
6750
Tornado进阶
前面的学习中,我们在创建tornado.web.Application的对象时,传入了第一个参数——路由映射列表。实际上Application类的构造函数还接收很多关于tornado web应用的配置参数
星哥玩云
2022/09/14
1.7K0
Tornado进阶
应用上下文
一、app对象 说明 全局应用对象 作用 加载配置 关联三方对象 注册蓝图 启动项管理 公共的全局的配置可以加载到该对象上 定义一些全局数据 需求 系统最多支持100个用户 公共配置 app.MAX_USER_NUM = <span class="hljs-number">100</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DefaultConfig</spa
星哥玩云
2022/09/14
2330
request对象(请求对象)
一、作用 获取请求报文中传递的数据 二、概述 浏览器发送到服务器的所有报文被flask接收后,创建出request对象,request被用在视图函数中,获取请求的数据 request对象由flask框架创建好,通过引入后就可以在视图中使用 导入 from flask import request 三、request属性 url 完整的请求URL base_url 去掉GET参数的URL url_root 去掉了?后面的参数 host_url 只有主机IP和端
星哥玩云
2022/09/14
1.1K0
相关推荐
cookie操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档