一周学会Flask3 Python Web开发-flask3上下文全局变量session,g和current_app

锋哥原创的Flask3 Python Web开发 Flask3视频教程:

2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili

flask3提供了session,g和current_app上下文全局变量来方便我们操作访问数据。

以下是一个表格,用于比较Flask中的session、g和current_app的相同点和不同点:

特性 session g (全局上下文) current_app (应用上下文)
用途 存储和跟踪用户特定数据 在请求处理期间共享数据 在应用上下文中访问应用配置和对象
存储位置 默认情况下存储在客户端cookie中,但可配置为其他地方 存储在应用上下文中的全局变量 存储在应用上下文中的全局变量
配置 可以配置会话存储方式和密钥 不涉及配置,存储在应用上下文中 不涉及配置,存储在应用上下文中
线程安全性
用于哪些情况 用户身份验证、购物车、用户偏好设置、用户活动记录等 在请求处理函数之外的地方访问请求相关的数据 在应用初始化之前或应用上下文之外访问应用配置和对象
存储和获取数据的方法 使用session对象的方法,如session['key'] 直接通过g对象的属性,如g.key 使用current_app对象的属性和方法,如current_app.config['key']
生命周期 可以配置会话的过期时间和持久性 与请求处理期间的生命周期相同 与应用的生命周期相同
示例 实现用户登录和购物车功能 在请求处理函数之外的地方共享数据库连接 访问应用配置和对象的示例

current_app的基本概念 current_app是Flask中的一个全局变量,代表当前运行的Flask应用实例。这个全局变量的存在使得在应用程序的各个部分都能够访问应用配置和其他应用特定的对象,而不需要显式传递应用实例。

current_app的作用 current_app的主要作用是让您能够在应用程序的不同部分中访问应用实例,以便获取应用配置、数据库连接和其他应用范围的对象。它简化了在不同模块之间共享应用上下文的过程,使得代码更加模块化和可维护。

current_app的使用 要使用current_app,首先需要导入flask模块并从中引用它。以下是如何使用current_app的示例:

复制代码
# 在应用上下文中使用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来访问和修改应用配置。

什么是应用上下文? 在Flask中,应用上下文是一个特定的环境,用于在请求处理期间存储和传递应用程序范围的数据。它允许在不同函数之间共享状态和数据,而不需要使用全局变量。

current_app与应用上下文的关系 current_app是应用上下文的一部分,它允许您在应用程序的任何地方访问应用实例。应用上下文的创建和销毁是由Flask自动管理的。

current_app何时可用,何时不可用? current_app只能在处于应用上下文中时才可用。它通常在请求处理期间可用,因此在视图函数中使用它是安全的。但是在应用初始化之前或应用上下文之外,使用current_app可能会导致异常。

比如,在前面的用户模块,我们就能访问到这个应用配置。

复制代码
@user_bp.route('/list')
def list():
    # 访问应用的配置
    debug_mode = current_app.config['DEBUG']
    print(f'DEBUG模式:{debug_mode}')
    return '用户列表'

g对象的基本概念 在Flask中,g是一个特殊的全局变量,用于存储在请求处理期间共享的数据。它允许您在不同的请求处理函数之间共享状态和数据,而不需要使用全局变量或显式传递参数。

g对象的作用 g的主要作用是在不同的请求处理函数之间传递数据,以便在同一请求处理期间的不同函数之间共享状态。这有助

我们看一个示例:

app.py主模块里设置一个全局变量

复制代码
@app.before_request
def set_name():
    g.username = '老六'

student.py里获取全局变量

复制代码
@student_bp.route('/list')
def list():
    print(g.get('username'))
    return '学生列表'


@student_bp.route('/index')
def index():
    print(g.get('username'))
    return '主页'

user.py里也获取下全局变量

复制代码
@user_bp.route('/list')
def list():
    # 访问应用的配置
    print(g.get('username'))
    return '用户列表'

测试下,都能获取:

相关推荐
2601_962295995 分钟前
Spark 和 Kafka 实现 Python 大规模情感分析
python·spark·kafka·情感分析·大规模处理
计算机源码社9 分钟前
分享一个基于大数据的跨平台内容生态画像与互动等级分析系统,基于Hadoop+Spark的社交媒体互动数据可视化大屏分析
大数据·hadoop·python·机器学习·数据挖掘·spark·毕业设计
minhuan13 分钟前
基于Playwright数据采集,大模型对接Flask+SQLite,平滑升级向量库与分布式微服务26.5
人工智能·flask·大模型应用·大模型业务集成·微服务架构演进
砚底藏山河17 分钟前
行情工程实战 M01|存储选型 CSVSQLiteMySQL
java·python·金融·maven
在所不辞兄31 分钟前
【零基础学智能仿真-11】CatBoost——让材料类型和边界条件参与力学预测
人工智能·python·深度学习·神经网络·机器学习·工程技术
2601_9620976937 分钟前
python的多线程编程之锁
python·多线程·同步·事件·
1 小时前
Python 图片处理:裁剪缩放至300×200,格式JPG/PNG/GIF,控制大小≤100KB
linux·前端·python
2601_962294611 小时前
Python工具软件开发:借助InsCode AI IDE开启智能编程新时代
ide·python·ai·开发工具·智能化编程
2601_962097363 小时前
GraphQL,Grafana和Dash
python·grafana·数据可视化·graphql·dash
benchmark_cc10 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash