Flask的session、闪现和g对象

Flask的session、闪现和g对象

一、Session

Flask中的Session机制允许在客户端和服务器之间保持状态信息,这对于构建交互式Web应用至关重要。

1. Session的使用:

在Flask中,Session默认是基于cookie的,它不在服务端存储数据,而是将数据加密后存储在客户端的cookie中。为了扩展性,开发者也可以将Session数据存储到如Redis这样的外部存储系统中。

  • 使用前必须设置secret_key

  • 设置Session值:通过session['key'] = value

  • 获取Session值:使用session.get('key')

  • 删除Session值:通过session.pop('username', None)

  • 清空Session值:通过session.clear()

2. Session的运行机制:

Flask的Session机制与Django等其他框架的Session机制有所不同。

  1. 将数据加密转换成字符串,并以cookie形式返回给前端。
  2. 浏览器在随后的请求中携带这个cookie。
  3. 服务器解析cookie,解密数据,并将其放入session对象中。

3.简单示例

from flask import Flask, session, redirect, url_for,  requestapp = Flask(__name__)# 设置 Flask 应用的 secret_key,这是必须的,用于安全地签名 session cookie
app.secret_key = 'your_secret_key_here'@app.route('/')
def index():# 检查 'username' 是否已经在 session 中if 'username' in session:username = session['username']# 如果用户已登录,显示欢迎信息return f'已登录,欢迎您,{username}!'return '您未登录!<br><a href="/login">点击这里登录</a>'@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':# 假设这里有一些用户验证逻辑# 如果验证通过,将用户名存储在 session 中session['username'] = request.form['username']return redirect(url_for('index'))return '''<form method="post">用户名:<input type="text" name="username"><input type="submit" value="登录"></form>'''@app.route('/logout')
def logout():# 删除 session 中的 'username' 键session.pop('username', None)return redirect(url_for('index'))if __name__ == '__main__':app.run(debug=True)

4.源码分析

Flask默认使用SecureCookieSessionInterface类来处理Session。

  • 请求到达时

    • 通过open_session方法,解析cookie中的Session数据并解密。

    • def open_session(self, app, request):# 打开一个会话并返回安全的Cookie会话或None# 获取签名序列化器s = self.get_signing_serializer(app)if s is None:return None# 从请求的cookie中获取值val = request.cookies.get(self.get_cookie_name(app))if not val:return self.session_class()# 将过期时间转换为秒max_age = int(app.permanent_session_lifetime.total_seconds())try:# 尝试解密数据并返回会话类data = s.loads(val, max_age=max_age)return self.session_class(data)except BadSignature:# 数据解密失败时返回会话类return self.session_class()
      
  • 请求结束时

    • 通过save_session方法,将session对象中的数据加密后保存到cookie中。

    • def save_session(self, app, session, response):name = self.get_cookie_name(app)  # 获取cookie名称domain = self.get_cookie_domain(app)  # 获取cookie的域path = self.get_cookie_path(app)  # 获取cookie的路径secure = self.get_cookie_secure(app)  # 获取cookie的安全属性samesite = self.get_cookie_samesite(app)  # 获取cookie的SameSite属性httponly = self.get_cookie_httponly(app)  # 获取cookie的httponly属性# 如果会话被访问,则向响应头部的"Vary"字段添加"Cookie"if session.accessed:response.vary.add("Cookie")# 如果会话被修改为空,则移除cookieif not session:if session.modified:response.delete_cookie(name,domain=domain,path=path,secure=secure,samesite=samesite,httponly=httponly,)response.vary.add("Cookie")return# 如果不应该设置cookie,则返回Noneif not self.should_set_cookie(app, session):return# 获取过期时间,加密会话数据expires = self.get_expiration_time(app, session)val = self.get_signing_serializer(app).dumps(dict(session))# 设置cookieresponse.set_cookie(name,val,  # type: ignoreexpires=expires,httponly=httponly,domain=domain,path=path,secure=secure,samesite=samesite,)response.vary.add("Cookie")
      

二、闪现

1.闪现机制

  1. 存储消息:使用 flash 函数在当前请求的 session 中设置一条消息。可以简单地传递消息文本,也可以指定一个类别(category)来对消息进行分类。
    • 例如:flash('超时错误', category='error')
    • category 是可选参数,可以用于分类消息。
  2. 重定向:通常在设置消息后,会使用 redirect 函数将用户重定向到一个新的页面,这样用户就可以在新的页面中看到消息。
  3. 获取消息:在重定向到的页面上,使用 get_flashed_messages 函数来获取存储的消息。这个函数默认会清除已经获取的消息。
    • 例如:messages = get_flashed_messages(category_filter=['error'])
    • 使用 get_flashed_messages(category_filter=['类别'], with_categories=False) 来获取设置的消息。
      • category_filter 是一个列表,用于指定需要获取哪些类别的消息。
      • with_categories 指定是否返回消息和它们的类别。

2.闪现特点

  • 消息只在下一个请求中可见,之后自动清除,这有助于避免重复显示消息。
  • 可以根据需要为消息设置不同的类别,便于在获取时进行筛选。

3.闪现示例

from flask import Flask, flash, get_flashed_messages, redirect, render_templateapp = Flask(__name__)
app.secret_key = 'your_secret_key'  # 必须设置 secret_key 以使用 session@app.route('/')
def index():# 如果发生错误,设置一个错误消息flash('超时错误', category='error')# 重定向到错误显示页面return redirect('/errors')@app.route('/errors')
def errors():# 从 'error' 类别中获取所有闪现的消息error_messages = get_flashed_messages(category_filter=['error'])# 将消息传递给模板进行显示# return render_template('errors.html', error_messages=error_messages)return f"错误信息:{error_messages}"
if __name__ == '__main__':app.run()

三、g对象

1. 介绍

在 Flask 中,g 对象是一个特殊的对象,用于存储每个请求的全局变量

  • 当请求到达 Flask 应用时,g 对象被创建。

  • g 对象用于存储在请求处理期间需要共享的数据。

  • 它是 global 的缩写,代表请求级别的全局变量。

  • g 对象在请求的整个生命周期内都是可用的,从请求到达开始,直到响应返回结束。

  • 使用 g 对象可以在不同的视图函数、装饰器或中间件之间共享数据。

  • Flask 不建议直接修改 request 对象来存储数据,因为 request 对象应该只包含请求的原始数据。

2.简单示例

from flask import Flask, g, requestapp = Flask(__name__)
app.debug = True@app.before_request
def before_request_func():if request.path == '/':  # 在每个请求处理之前,检查请求的路径是否为根路径g.path = "g_path"  # 如果是根路径,则将路径信息存储在全局对象g中@app.route('/')
def index():print(g.get('path', 'not found'))  # 如果存在打印信息,否则打印not foundreturn 'index'@app.route('/home')
def home():print(g.get('path', 'not found'))  # 如果存在打印信息,否则打印not foundreturn 'home'if __name__ == '__main__':app.run()

四、三者之间的异同

在Flask中,session、g对象和闪现(flash)是三种不同的机制,它们用于在请求之间存储和传递数据。

1. Session

  • 定义:Session是服务器端存储,用于跨多个请求保持用户状态。它通常存储在服务器的内存或数据库中,并且可以通过客户端的cookie来访问。
  • 使用场景:适用于需要在用户会话期间保持状态的情况,如用户登录状态、购物车内容等。
  • 特点
    • 数据存储在服务器端,客户端通过cookie访问。
    • 可以存储任意类型的数据。
    • 需要设置秘钥(SECRET_KEY)来保证安全性。

2. g对象

  • 定义:g是一个全局对象,用于在应用的请求和上下文中存储数据。g对象的数据只会在当前请求的生命周期内有效。
  • 使用场景:适用于在同一请求中不同视图函数之间共享数据。
  • 特点
    • 数据仅在当前请求有效,请求结束后数据会被销毁。
    • 可以通过g对象存储临时数据。
    • 通常用于避免在视图函数中重复计算或获取数据。

3.闪现(Flash)

  • 定义:闪现是一种特殊的消息传递机制,用于在请求之间传递一次性消息。闪现的消息在下一次请求时自动清除。
  • 使用场景:适用于需要向用户显示一次性反馈信息的情况,如表单提交后的成功或错误消息。
  • 特点
    • 消息在下一次请求时自动清除,只显示一次。
    • 通常用于用户交互反馈,如“注册成功”、“登录失败”等。
    • 可以通过flash()函数来设置消息,并在模板中使用get_flashed_messages()来显示。
    • 需要设置秘钥(SECRET_KEY)来保证安全性。

4.异同点:

  • 相同点
    • 都是Flask框架提供的数据存储和传递机制。
    • 都可以在请求之间传递信息。
  • 不同点
    • 生命周期:session跨多个请求有效,g对象仅在当前请求有效,闪现在下一次请求后自动清除。
    • 存储位置:session存储在服务器端,g对象和闪现的数据存储在服务器内存中。
    • 使用目的:session用于保持用户状态,g对象用于请求内数据共享,闪现用于一次性用户反馈。
    • 安全性:session需要设置秘钥来保证安全,g对象和闪现通常用于传递非敏感信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

async、await 官宣:JavaScript 中的异步编程新纪元

【作者主页】&#xff1a;小鱼神1024 【擅长领域】&#xff1a;JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 async/await 是 ECMAScript 2017 标准中引入的一种用于处理异步操作的语法糖。它基于 Promise 和 Gen…

Cesium czml创建目标

一次性加载 (method) DataSourceCollection.add(dataSource: Cesium.DataSource | Promise<Cesium.DataSource>): Promise<Cesium.DataSource>const czml [{id: "document",name: "CZML Point",version: "1.0",clock: {"inte…

02逻辑代数与硬件描述语言基础

2.1 逻辑代数&#xff08;简单逻辑的运算&#xff09; 2.2 逻辑函数的卡诺图&#xff08;从图论的角度&#xff09;化简法 2.3 硬件描述语言Verilog HDL基础&#xff08;研究生阶段才用得到&#xff09; 要求&#xff1a; 1、熟悉逻辑代数常用基本定律、恒等式和规则。 2、掌握…

武汉高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

随着科技的不断进步和工业4.0的深入推进&#xff0c;智能制造已成为现代工业发展的重要方向。在这一背景下&#xff0c;武汉高校大学智能制造实验室积极响应国家号召&#xff0c;致力于将先进的数字孪生技术与智能制造教育相结合&#xff0c;打造了一个集教学、实训、科研于一体…

【JavaScript】事件绑定

目录 一、什么是事件 二、常见事件 2.1 鼠标事件 2.2 键盘事件 2.3 表单事件 2.4 页面加载事件 三、浏览器弹窗三种方式 四、事件绑定函数方式 五、事件触发方式 一、什么是事件 事件就是行为动作。在HTML中事件可以是浏览器的行为&#xff0c;也可以是用户的行为。当这些行为发…

基于esp-idf的arm2d移植

什么是ARM2D Arm在Github上发布了一个专门针对“全体” Cortex-M处理器的2D图形加速库——Arm-2D 我们可以简单的把这个2D图形加速库理解为是一个专门针对Cortex-M处理器的标准“显卡驱动”。虽然这里的“显卡驱动”只是一个夸张的说法——似乎没有哪个Cortex-M处理器“配得上…

丝杆支撑座:滚珠丝杆稳定运行的守护者!

丝杆支撑座是丝杆和电机之间连接的重要组成部分&#xff0c;发挥着非常重要的功能。提到丝杆支撑座和滚珠丝杆&#xff0c;很多人都会想到支撑关系&#xff0c;但丝杆支撑座作为滚珠丝杆系统中至关重要的角色&#xff0c;其作用远不止于简单的支撑。 丝杆支撑座安装过程非常简单…

绘唐3是免费的吗?

绘唐科技是一家中国电子信息产品制造商和供应商&#xff0c;成立于2005年。公司主要经营智能硬件、智能穿戴设备、智能家居设备和智能交通设备等领域的产品开发和销售。绘唐科技拥有强大的研发团队和制造能力&#xff0c;能够为客户提供定制化的产品解决方案。 绘唐科技的产品种…

CS-隐藏防朔源-数据转发-iptables(Linux自带的防火墙)

免责声明:本文仅做技术交流与学习... 目录 准备环境: 1-iptables转发机设置转发: 2-CS服务器配置iptables服务器的IP 准备环境: 两台外网服务器. --iptables服务器就是做一个中转...封了中转就没了... 1-iptables转发机设置转发: iptables -I INPUT -p tcp -m tcp --dport 8…

一个简化的C语言扫地机器人系统编写步骤

使用C语言直接编写一个完整的智能扫地机器人系统是非常复杂的&#xff0c;因为这不仅涉及到底层硬件的控制&#xff0c;还包括网络通信、用户交互等多个方面。然而&#xff0c;我们可以将任务拆分为几个部分&#xff0c;并专注于使用C语言编写与硬件交互和可能的一些基础网络通…

ACC:Automatic ECN Tuning for High-Speed Datacenter Networks 相关知识点介绍(一)

目录 ACC&#xff08;Adaptive Congestion Control&#xff09; 总结 结合 ACC 和 ECN ECN ECN&#xff08;Explicit Congestion Notification&#xff09; 静态 ECN 动态 ECN 对比 总结 FCT——flow completion time 具体解释 小鼠流和大象流 小鼠流&#xff08;…

【最新综述】基于伪标签的半监督语义分割

Semi-Supervised Semantic Segmentation Based on Pseudo-Labels: A Survey 摘要&#xff1a; 语义分割是计算机视觉领域的一个重要而热门的研究领域&#xff0c;其重点是根据图像中像素的语义对其进行分类。然而&#xff0c;有监督的深度学习需要大量数据来训练模型&#xff…

GPT-5的到来:智能飞跃与未来畅想

IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂确认了GPT-5的发布计划&#xff0c;预计将在一年半后推出。穆拉蒂形象地将GPT-4到GPT-5的飞跃比作高中生到博士生的成长。这一飞跃将给我们带来哪些变化&#xff1f;GPT-5的…

电路笔记(电源模块):TPS82130降压模块

芯片引脚说明 Layer 1 1 2 3 4 5 6 7 8 SS/TR PG FB VOUT EN VIN GND VOUT Thermal Pad 使能引脚&#xff0c;高电平启动。 反馈参考引脚。 连接到该引脚的外部电阻分压器对输出电压进行编程。 电源开漏输出引脚。 软启动和电压跟踪引脚。 上拉电阻可以连接到任何低于6V的电压。…

如何使用WxPusher向个人微信推送发送实时消息,比如定时任务等

wxpusher-sdk-java这个框架开源了&#xff1a;GitHub - wxpusher/wxpusher-sdk-java: 微信消息实时推送服务[WxPusher]的Java版本sdk&#xff0c;可以通过API实时给个人微信推送消息。wechat pusher. 文档地址&#xff1a;WxPusher微信推送服务 WxPusher (微信推送服务)是一个…

Spring Boot与MyBatis的集成应用

Spring Boot与MyBatis的集成应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊聊Spring Boot与MyBatis的集成应用。MyBatis是一款优秀的持久层框…

湖北大学2024年成人高考函授报名专升本教育学专业介绍

湖北大学&#xff0c;作为一所历史悠久、文化底蕴深厚的学府&#xff0c;其成人高等继续教育体系更是为广大学子提供了一片展翅高飞的蓝天。在这片知识的海洋中&#xff0c;专升本教育学专业如同一颗璀璨的明珠&#xff0c;闪耀着智慧的光芒。 湖北大学的专升本教育学专业&…

Postgresql从小白到高手 九 : psql高级查询及内部视图使用

Postgresql从小白到高手 九:pgsql 复杂查询及内部表高级查询 文章目录 Postgresql从小白到高手 九:pgsql 复杂查询及内部表高级查询一、多表查询二、pgsql内部表1.内部表2.内部表查询应用 一、多表查询 内联 &#xff1a;inner join on 简写 join on 结果集只有符合 筛选条件…

AI Native应用中的模型微调

AI Native应用中的模型微调 随着人工智能技术的飞速发展&#xff0c;AI Native应用已成为当今软件开发的前沿阵地。在AI Native应用中&#xff0c;模型微调是提升模型性能的关键步骤&#xff0c;它通过在特定领域的数据上进行学习&#xff0c;使模型更好地适应应用场景&#x…

Android U Settings 应用中 APN 菜单实现的代码逻辑

功能简介 MobileNetwork移动网络设置页面下有【接入点设置】(APN)。 问题:为什么Controller初始化找不到pref,然后报错。 Note:什么时候切换成Controller的呢?在Android T&U 上还没有更新成kt实现 ,但是已经有Controller的方案。 流程逻辑 1、界面“telephony_a…