Flask中的装饰器Decorator和上下文管理器ContextManager

embedded/2025/3/20 6:34:10/

Flask 中的 装饰器(Decorator)上下文管理器(Context Manager) 都用于增强代码的功能,但它们的用途和实现方式不同。


1. 装饰器(Decorator)

特点

用于修改或增强函数/类的行为,不影响原始代码。
常用于 Flask 的路由、请求前后处理、认证等
基于 Python 的高阶函数,使用 @ 语法。

示例

python">from flask import Flaskapp = Flask(__name__)# Flask 路由装饰器
@app.route('/')
def home():return "Hello, Flask!"

这里 @app.route('/') 是一个装饰器,它修改了 home() 的行为,使其成为 Flask 的路由处理函数

应用场景

  • 定义 URL 路由@app.route)。
  • 请求前后钩子@app.before_request@app.after_request)。
  • 自定义权限认证@login_required)。
  • 错误处理@app.errorhandler(404))。

自定义 Flask 装饰器

python">from flask import request, jsonifydef login_required(f):def wrapper(*args, **kwargs):token = request.headers.get("Authorization")if not token:return jsonify({"error": "未授权"}), 401return f(*args, **kwargs)return wrapper@app.route('/protected')
@login_required
def protected():return jsonify({"message": "成功访问受保护资源"})

这里 @login_required 在执行视图函数前先检查是否有 Authorization,如果没有则返回 401


2. 上下文管理器(Context Manager)

特点

用于管理资源的生命周期(初始化 & 释放),比如数据库连接、文件操作。
通常与 with 语句一起使用,确保资源在使用后自动释放。
可以使用 @contextmanager(简化)或 class(完整实现)。

示例

python">from contextlib import contextmanager@contextmanager
def my_resource():print("资源初始化")yield "资源对象"print("资源清理")with my_resource() as res:print(f"正在使用: {res}")

输出:

资源初始化
正在使用: 资源对象
资源清理

应用场景

  • 数据库会话管理
  • 文件操作
  • Flask 的应用上下文和请求上下文
  • 事务处理(commit/rollback

Flask 中的数据库上下文管理

python">from contextlib import contextmanager
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engineengine = create_engine("sqlite:///example.db")
Session = sessionmaker(bind=engine)@contextmanager
def get_db_session():"""管理数据库连接"""session = Session()try:yield session  # 提供 sessionsession.commit()  # 事务提交except Exception:session.rollback()  # 事务回滚raisefinally:session.close()  # 关闭连接@app.route('/data')
def get_data():with get_db_session() as session:result = session.execute("SELECT 'Hello Flask!'").fetchone()return result[0]
  • yield session 提供数据库连接
  • commit() 提交事务
  • rollback() 出错时回滚
  • close() 关闭连接,避免资源泄露

3. Flask 装饰器 vs. 上下文管理器

特性装饰器(Decorator)上下文管理器(Context Manager)
作用修改/增强函数行为管理资源的创建和释放
使用方式@ 语法修饰函数with 语句
常见用途Flask 路由、请求前后钩子、认证数据库连接、文件操作、事务管理
是否修改原函数
何时执行函数调用前后进入/退出 with 代码块时

4. 结合使用装饰器 & 上下文管理器

装饰器和上下文管理器可以结合使用,例如,在 Flask 中使用装饰器封装数据库事务

python">def transactional(f):"""装饰器封装事务"""@wraps(f)def wrapper(*args, **kwargs):with get_db_session() as session:return f(session, *args, **kwargs)return wrapper@app.route('/users')
@transactional
def get_users(session):"""获取用户列表"""return {"users": session.execute("SELECT * FROM users").fetchall()}

transactional 作为装饰器
get_db_session() 作为上下文管理器
自动管理数据库事务


5. 结论

  1. 装饰器
    • 修改函数的行为,增强功能(如 Flask 路由、认证)。
    • @ 语法修饰函数,在函数调用时执行。
    • 适用于权限验证、错误处理、日志等场景
  2. 上下文管理器
    • 管理资源的生命周期(如数据库连接、文件操作)。
    • with 语句管理资源,确保正确释放。
    • 适用于事务、应用上下文、请求上下文等
  3. 两者可以结合,如用装饰器封装数据库事务,让代码更简洁优雅。

如果你的 Flask 项目中涉及资源管理(数据库、文件),建议结合使用两者,让代码更高效! 🚀

文章来源:https://blog.csdn.net/weixin_41405524/article/details/146299706
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/embedded/173475.html

相关文章

需求分析、定义、验证、变更、跟踪(高软47)

系列文章目录 需求分析、定义、验证、变更、跟踪 文章目录 系列文章目录前言一、需求分析二、需求定义三、需求验证四、需求变更五、需求跟踪六、真题总结 前言 本节讲明需求分析、定义、验证、变更、跟踪相关知识。 一、需求分析 二、需求定义 三、需求验证 四、需求变更 五、…

Oracle中In和Exists区别分析

在Oracle中,IN和EXISTS都是用于子查询的条件判断,但它们在执行逻辑、性能和应用场景上有显著区别。以下是两者的主要差异: 1.执行机制 IN IN 先执行子查询,将子查询的结果集缓存到内存中,生成一个静态列表。 主查询的…

vue3 前端路由权限控制与字典数据缓存实践(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 从实战中出发: 1. 基本知识 Vue3 和 Java 通信时如何进行字典数据管理 需要了解字典数据的结构。通常&#x…

Python贪吃蛇小游戏

文章目录 背景介绍1. **学习编程的基础**2. **锻炼编程能力**3. **探索游戏开发的乐趣**4. **为更复杂的项目打基础**5. **个人兴趣和挑战** 背景介绍 贪吃蛇(Snake Game)是一款经典的电子游戏,最早可以追溯到20世纪70年代。它的设计非常简单…

MySQL存入表情包异常,修改表、字段的字符集/排序规则

环境 MySQL:8 序言 由于文本中存在表情包,存入数据库时,如果是utf8字符集会报错,故需要将字符集改为:utf8mb4 脚本 表级别:ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_…

hackme靶机通关攻略

第一步:确定靶机IP 第二步:使用御剑后台扫描工具扫描敏感文件 第三步:访问register.php注册登录,进入welcome.php页面 第四步:访问一个不存在的页面,确定网站使用的中间件是Apache(无用&#xf…

OkHttp 的证书设置

在 Android 开发中,通过 OkHttp 自定义 SSLSocketFactory 和 X509TrustManager 可以有效增强 HTTPS 通信的安全性,防止中间人攻击(如抓包工具 Charles/Fiddler 的拦截)。以下是实现防抓包的关键技术方案: 一、Okhttp设…

JVM 详解:Java 虚拟机的核心机制

目录 引言:为什么 JVM 是 Java 生态的基石? 一、什么是 JVM? 1.1 JVM 的核心作用 二、JVM 的架构 2.1 类加载器(Class Loader) 2.2 运行时数据区(Runtime Data Areas) 2.3 执行引擎&#…