Python Flask 基础入门第六课: Flask 全局变量 current_app, g 以及 session各自如何使用 有什么差异
全局变量 current_app, g 以及 session
- 全局变量差异汇总表
- current_app
- 章节1 current_app - 当前应用实例
- current_app的基本概念
- current_app的作用
- current_app的使用
- 章节2:current_app的上下文
- 什么是应用上下文?
- current_app与应用上下文的关系
- current_app何时可用,何时不可用?
- g
- 章节1:g - 全局上下文
- g对象的基本概念
- g对象的作用
- 章节2:g对象的使用
- 在视图函数中使用g对象
- 在请求处理函数之外的地方使用g对象
- 章节3:应用上下文和线程安全性
- 应用上下文的生命周期
- g对象的线程安全性
- 章节4:为什么使用g对象?
- 为什么不使用全局变量?
- 常见用例
- 章节5:示例:使用g对象共享数据库连接
- session
- 章节1:会话(Session)的基本概念
- 会话的定义
- 会话与Cookie的关系
- 章节2:会话的作用
- 会话的主要作用
- 章节3:Flask中的会话
- Flask中的会话对象
- 配置会话存储方式
- 章节4:示例:使用会话实现用户登录
- 示例1:用户登录
- 章节5:示例:使用会话实现购物车功能
- 示例2:购物车功能
全局变量差异汇总表
以下是一个表格,用于比较Flask中的session
、g
和current_app
的相同点和不同点:
特性 | session | g (全局上下文) | current_app (应用上下文) |
---|---|---|---|
用途 | 存储和跟踪用户特定数据 | 在请求处理期间共享数据 | 在应用上下文中访问应用配置和对象 |
存储位置 | 默认情况下存储在客户端cookie中,但可配置为其他地方 | 存储在应用上下文中的全局变量 | 存储在应用上下文中的全局变量 |
配置 | 可以配置会话存储方式和密钥 | 不涉及配置,存储在应用上下文中 | 不涉及配置,存储在应用上下文中 |
线程安全性 | 是 | 是 | 是 |
用于哪些情况 | 用户身份验证、购物车、用户偏好设置、用户活动记录等 | 在请求处理函数之外的地方访问请求相关的数据 | 在应用初始化之前或应用上下文之外访问应用配置和对象 |
存储和获取数据的方法 | 使用session 对象的方法,如session['key'] | 直接通过g 对象的属性,如g.key | 使用current_app 对象的属性和方法,如current_app.config['key'] |
生命周期 | 可以配置会话的过期时间和持久性 | 与请求处理期间的生命周期相同 | 与应用的生命周期相同 |
示例 | 实现用户登录和购物车功能 | 在请求处理函数之外的地方共享数据库连接 | 访问应用配置和对象的示例 |
当涉及到Flask中的current_app
时,理解它的概念和使用方法至关重要。让我们通过更多的Python示例来进一步说明这些概念。
current_app
章节1 current_app - 当前应用实例
current_app的基本概念
current_app
是Flask中的一个全局变量,代表当前运行的Flask应用实例。这个全局变量的存在使得在应用程序的各个部分都能够访问应用配置和其他应用特定的对象,而不需要显式传递应用实例。
current_app的作用
current_app
的主要作用是让您能够在应用程序的不同部分中访问应用实例,以便获取应用配置、数据库连接和其他应用范围的对象。它简化了在不同模块之间共享应用上下文的过程,使得代码更加模块化和可维护。
current_app的使用
要使用current_app
,首先需要导入flask
模块并从中引用它。以下是如何使用current_app
的示例:
from flask import Flask, current_appapp = Flask(__name__)# 在应用上下文中使用current_app
with app.app_context():# 配置DEBUG模式app.config['DEBUG'] = True# 访问应用配置debug_mode = current_app.config['DEBUG']print(f"DEBUG模式: {debug_mode}")
在这个示例中,我们首先创建了一个Flask应用实例,并在应用上下文中使用app.app_context()
创建应用上下文,以便可以安全地访问current_app
。接下来,我们调整了应用配置中的DEBUG
标志,并使用current_app
来访问配置值并输出到控制台。
这个示例展示了如何在应用上下文中使用current_app
来访问和修改应用配置。
章节2:current_app的上下文
什么是应用上下文?
在Flask中,应用上下文是一个特定的环境,用于在请求处理期间存储和传递应用程序范围的数据。它允许在不同函数之间共享状态和数据,而不需要使用全局变量。
current_app与应用上下文的关系
current_app
是应用上下文的一部分,它允许您在应用程序的任何地方访问应用实例。应用上下文的创建和销毁是由Flask自动管理的。
current_app何时可用,何时不可用?
current_app
只能在处于应用上下文中时才可用。它通常在请求处理期间可用,因此在视图函数中使用它是安全的。但是在应用初始化之前或应用上下文之外,使用current_app
可能会导致异常。
下面是一个示例,演示了如何在请求处理函数中使用current_app
来访问应用配置:
from flask import Flask, current_app, requestapp = Flask(__name__)@app.route('/')
def home():# 在视图函数中使用current_appdebug_mode = current_app.config['DEBUG']user_agent = request.headers.get('User-Agent')return f"DEBUG模式: {debug_mode}<br>User-Agent: {user_agent}"
在这个示例中,我们在home
视图函数中使用了current_app
来访问应用配置中的DEBUG
模式,并使用request
对象来获取用户代理(User-Agent)头部信息。
通过这些示例,我们更深入地了解了current_app
的概念和用法,并展示了如何在应用上下文中正确使用它。这有助于构建更健壮和可维护的Flask应用程序。
当涉及到Flask中的g
全局变量时,了解其概念和使用方法是构建更强大和可维护的应用程序的关键。本篇博客将深入讨论g
的基本概念、作用、应用上下文以及提供多个Python示例来说明其用途。
g
章节1:g - 全局上下文
g对象的基本概念
在Flask中,g
是一个特殊的全局变量,用于存储在请求处理期间共享的数据。它允许您在不同的请求处理函数之间共享状态和数据,而不需要使用全局变量或显式传递参数。
g对象的作用
g
的主要作用是在不同的请求处理函数之间传递数据,以便在同一请求处理期间的不同函数之间共享状态。这有助于保持代码的干净和可维护。
章节2:g对象的使用
在视图函数中使用g对象
要在视图函数中使用g
对象,首先需要导入flask
模块并从中引用它。以下是一个示例:
from flask import Flask, g, requestapp = Flask(__name__)@app.before_request
def before_request():# 在请求之前设置g对象的数据g.user = 'John'@app.route('/')
def home():# 在视图函数中访问g对象的数据user = g.userreturn f"欢迎, {user}!"
在这个示例中,我们使用before_request
装饰器来在请求之前设置g
对象的数据。然后,在home
视图函数中,我们可以轻松地访问g.user
,这使得在不同视图函数之间共享用户数据变得非常方便。
在请求处理函数之外的地方使用g对象
要在请求处理函数之外的地方使用g
对象,需要确保在应用上下文中,例如在一个自定义函数或中间件中。以下是一个示例:
from flask import Flask, gapp = Flask(__name__)def some_function():# 在函数中使用g对象,确保处于应用上下文中if 'user' in g:user = g.userreturn f"欢迎, {user}!"else:return "未找到用户数据"@app.before_request
def before_request():# 在请求之前设置g对象的数据g.user = 'Alice'@app.route('/')
def home():return some_function()
在这个示例中,我们创建了一个自定义函数some_function()
,并在函数中使用了g
对象。在before_request
装饰器中,我们设置了g.user
的数据,以便在some_function()
中访问。
章节3:应用上下文和线程安全性
应用上下文的生命周期
Flask管理应用上下文的创建和销毁,确保每个请求都有自己的上下文,避免数据混淆。每个请求处理完毕后,上下文会被销毁。
g对象的线程安全性
由于应用上下文的管理,g
对象是线程安全的。不同线程的g
对象互不干扰,每个线程都有自己的上下文和g
对象。
章节4:为什么使用g对象?
为什么不使用全局变量?
使用全局变量在多线程环境中可能会导致竞争条件和数据不一致性。g
对象提供了一种更安全和可维护的方式,在请求处理期间共享数据,而不会引入全局变量的问题。
常见用例
- 跨多个视图函数共享数据,如当前用户信息或数据库连接。
- 在请求处理函数之外的地方访问请求相关的数据,例如自定义函数或中间件。
章节5:示例:使用g对象共享数据库连接
from flask import Flask, g
import sqlite3app = Flask(__name__)
app.config['DATABASE'] = 'mydatabase.db'def get_db():db = getattr(g, '_database', None)if db is None:db = g._database = sqlite3.connect(app.config['DATABASE'])return db@app.route('/')
def home():db = get_db()# 使用数据库连接执行查询cursor = db.execute('SELECT * FROM users')users = cursor.fetchall()return str(users)@app.teardown_appcontext
def close_db(error):db = getattr(g, '_database', None)if db is not None:db.close()if __name__ == '__main__':app.run()
在这个示例中,我们使用g
对象来共享数据库连接。get_db()
函数负责获取数据库连接,确保每个请求都有自己的连接。close_db()
函数在应用上下文结束时关闭数据库连接,以确保资源的正确释放。
这篇博客详细介绍了Flask中的g
全局变量,包括其基本概念、作用、应用上下文、线程安全性、为什么使用它以及多个Python示例来说明其用途。了解如何正确使用g
将有助于构建更健壮和可维护的Flask应用程序。
当涉及到Flask中的会话(session)时,了解其概念和用法对于构建具有用户状态跟踪需求的Web应用程序非常重要。本篇博客将深入讨论Flask中的会话的基本概念、作用、配置以及提供多个示例来说明如何使用会话来跟踪用户状态。
session
章节1:会话(Session)的基本概念
会话的定义
会话是一种在Web应用程序中用于存储和跟踪用户特定数据的机制。它允许您在不同的HTTP请求之间存储和检索数据,以便实现用户认证、购物车、用户偏好设置等功能。
会话与Cookie的关系
通常,会话数据会存储在服务器上,并通过一个唯一的标识符(通常是一个cookie)与用户的浏览器关联起来。浏览器会在每个请求中发送该标识符,以便服务器识别用户并获取其相关数据。
章节2:会话的作用
会话的主要作用
会话的主要作用是跟踪用户的状态和存储与用户相关的信息。以下是一些常见的用例:
-
用户身份验证:会话可以用来存储已登录用户的信息,以便在整个会话期间保持其登录状态。
-
购物车:会话可以用来存储购物车中的商品,以便用户在浏览不同页面时保持其购物车状态。
-
用户首选项:会话可以用来存储用户的偏好设置,例如语言、主题等。
-
记录用户活动:会话可以用来跟踪用户的活动,例如最后一次访问时间、页面浏览次数等。
章节3:Flask中的会话
Flask中的会话对象
在Flask中,会话是通过session
对象来管理的。session
对象提供了一组方法来设置、获取和删除会话数据。
配置会话存储方式
在Flask中,您可以配置会话数据的存储方式。默认情况下,会话数据存储在客户端的cookie中,但也可以配置为存储在服务器上的数据库或其他存储介质中。
from flask import Flask, sessionapp = Flask(__name__)# 使用密钥对会话数据进行加密
app.config['SECRET_KEY'] = 'mysecretkey'
章节4:示例:使用会话实现用户登录
示例1:用户登录
以下示例演示了如何使用会话来实现用户登录功能。用户的用户名和密码将被存储在会话中,以便在整个会话期间保持其登录状态。
from flask import Flask, request, sessionapp = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecretkey'@app.route('/login', methods=['POST'])
def login():if request.method == 'POST':username = request.form['username']password = request.form['password']# 假设进行身份验证if username == 'user' and password == 'password':session['logged_in'] = Truesession['username'] = usernamereturn '登录成功'else:return '登录失败'@app.route('/profile')
def profile():if 'logged_in' in session:return f'欢迎, {session["username"]}!'else:return '未登录'if __name__ == '__main__':app.run()
在这个示例中,用户的登录状态和用户名存储在会话中。/login
路由用于接收用户的登录表单,并将登录状态存储在会话中。/profile
路由检查用户是否已登录,如果已登录,则显示欢迎消息。
章节5:示例:使用会话实现购物车功能
示例2:购物车功能
以下示例演示了如何使用会话来实现购物车功能。用户可以将商品添加到购物车中,购物车的内容将存储在会话中。
from flask import Flask, request, session, render_templateapp = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecretkey'@app.route('/')
def index():return render_template('index.html', cart=session.get('cart', {}))@app.route('/add_to_cart/<product>')
def add_to_cart(product):cart = session.get('cart', {})cart[product] = cart.get(product, 0) + 1session['cart'] = cartreturn '商品已添加到购物车'if __name__ == '__main__':app.run()
在这个示例中,购物车的内容存储在会话中的cart
键下。用户可以通过访问/add_to_cart/<product>
路由来添加商品到购物车中。
这篇博客详细介绍了Flask中的会话的概念、作用、配置以及通过示例演示了如何使用会话来实现用户登录和购物车功能。会话是构建用户状态跟踪功能的关键,对于许多Web应用程序都至关重要。通过了解如何使用会话,您可以更好地满足用户的需求和提供个性化的体验。
相关文章:
Python Flask 基础入门第六课: Flask 全局变量 current_app, g 以及 session各自如何使用 有什么差异
全局变量 current_app, g 以及 session 全局变量差异汇总表current_app章节1 current_app - 当前应用实例current_app的基本概念current_app的作用current_app的使用 章节2:current_app的上下文什么是应用上下文?current_app与应用上下文的关系current_a…...
第33节: Vue3 方法与在线检测
UniApp 使用 Vue3 框架时,您可以使用方法和在线检测来处理应用程序中的逻辑和数据。下面是一个示例,演示了如何在 UniApp 中使用 Vue3 框架使用方法和在线检测: <template> <view> <button click"handleClick"&g…...

React学习计划-React16--React基础(二)组件与组件的3大核心属性state、props、ref和事件处理
1. 组件 函数式组件(适用于【简单组件】的定义) 示例: 执行了ReactDOM.render(<MyComponent/>, ...)之后执行了什么? React解析组件标签,找到了MyComponent组件发现组件是使用函数定义的,随后调用该…...

flink yarn-session 启动失败retrying connect to server 0.0.0.0/0.0.0.0:8032
原因分析,启动yarn-session.sh,会向resourcemanager的端口8032发起请求: 但是一直无法请求到8032端口,触发重试机制会不断尝试 备注:此问题出现时,我的环境ambari部署的HA 高可用hadoop,三个节点…...
.NET面试题(二)
1.c# 中new关键字的作用 实例化对象和调用构造函数:当使用 new 关键字创建一个类的实例时,它会为对象分配内存,并调用相应的构造函数来初始化该对象。 隐藏基类成员(方法、属性、事件等):当在派生类中…...
ffplay工具
在编译ffmpeg时,如果系统中包含了SDL库,则会默认编译生成ffplay工具,否则无法生成ffplay工具。 ffplay即可以作为播放器,也可以作为很多图像化音视频数据的分析工具,通过它可以看到视频图像的运动估计方向、音频数据的…...
第36节: Vue3 事件修饰符
在UniApp中使用Vue3框架时,你可以使用事件修饰符来更方便地处理用户交互事件。以下是一个示例,演示了如何在UniApp中使用Vue3框架使用事件修饰符: <template> <view> <button click.prevent"handleClick">Cli…...

如何在本地安装Flask并将其web界面发布到公网上远程访问协同开发
目录 前言 1. 安装部署Flask 2. 安装Cpolar内网穿透 3. 配置Flask的web界面公网访问地址 4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask,以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架,…...

八:爬虫-MySQL基础
一:MySQL数据库基础 1.MySQL数据库介绍 MySQL是一个[关系型数据库管理系统],由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Rela…...

Android定制ROM简介
Android定制ROM简介 这篇文章是为对自定义ROM、AOSP等词汇不太熟悉的技术爱好者和好奇的人写的。我希望通过向您介绍这个世界来开始博客写作。 在我们将注意力转向定制ROM之前,让我们先了解一些基础知识。 什么是操作系统? 维基百科对此的定义简洁而…...

百模大战中的AI行业:新趋势与未来发展
文章目录 每日一句正能量前言技术进步应用拓展行业变革人才竞争后记 每日一句正能量 人生最重要的价值是心灵的幸福,而不是任何身外之物。 前言 随着科技的迅猛发展,人工智能(AI)已经成为引领技术革命的重要驱动力之一。在当前的…...

VScode安装C/C++编译器步骤
一、安装C/C插件 二、安装 MinGW-w64 工具链 使用国内源 git clone https://gitee.com/cuihongxi/ubuntu2-mac.git 下载后进入到VScode文件夹下,点击msys2-x86_64-20231026.exe进行安装 完成后,确保选中“立即运行 MSYS2”框,然后选择“完…...

【Date对象】js中的日期类型Date对象的使用详情
😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:JavaScript小贴士 👐学习格言:成功不是终点,失败也并非末日,最重要的是继续…...

【PyTorch】代码学习
文章目录 直接定义nn.Sequential(), 然后append(),最后直接net(),少写很多forward,适合直连式网络 直接定义nn.Sequential(), 然后append(),最后直接net(),少写很多forward,适合直连式网络 代码来源:https://github.com/zshhans/MSD-Mixer/b…...
ElasticSeach--springboot中使用
目录 一.引入依赖 二.配置链接信息 三.索引库测试 1.创建索引库 2.查询索引库 3.删除索引库 四.文档测试 1.添加文档 2.修改文档 3.删除文档 4.查询具体文档 5.批量添加文档 五.查询测试 1.查询所有 2.根据属性term匹配查询 3.分页查询 4.排序 5.过滤属性 6.boo…...

(1)(1.9) MSP (version 4.2)
文章目录 前言 1 协议概述 2 配置 3 参数说明 前言 ArduPilot 支持 MSP 协议,可通过任何串行端口进行遥测、OSD 和传感器。这样,ArduPilot 就能将遥测数据发送到 MSP 兼容设备(如大疆护目镜),用于屏幕显示&#x…...
mysql 表锁 行锁
目录 表锁(Table Lock) 行锁(Row Lock) 进一步通过举例解释 update操作走的是什么锁 表锁示例: 行锁示例: MySQL 中常见的锁类型包括: 表锁(Table Lock) 是针对整个…...
Google 提示:切忌滥用 DORA 指标
谷歌的 DevOps 研究与评估团队从事指标交易,即 DevOps 指标。但其最新的相关报告也警告不要过度使用这些指标。 DevOps 研究与评估小组(DORA)建议 IT 专业人员根据四个关键指标来评估团队绩效:部署频率,变更准备时间&a…...

2023年全球架构师峰会(ArchSummit北京站2023)-核心PPT资料下载
一、峰会简介 ArchSummit聚焦业界强大的技术成果,秉承“实践第一、案例为主”的原则,展示先进技术在行业中的典型实践,以及技术在企业转型、发展中的推动作用。旨在帮助技术管理者、CTO、架构师做好技术选型、技术团队组建与管理,…...

安全、高效的MySQL DDL解决方案
MySQL作为目前应用最广泛的开源关系型数据库,是许多网站、应用和商业产品的主要数据存储。在生产环境,线上数据库常常面临着持续的、不断变化的表结构修改(DDL),如增加、更改、删除字段和索引等等。其中一些DDL操作在M…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
手动给中文分词和 直接用神经网络RNN做有什么区别
手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动)…...

python可视化:俄乌战争时间线关键节点与深层原因
俄乌战争时间线可视化分析:关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一,自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具,系统分析这场战争的时间线、关键节点及其背后的深层原因,全面…...