Flask中的装饰器

server/2025/3/18 1:48:06/

在 Flask 中,装饰器(Decorator)是一种 Python 语法特性,它允许你在不修改原始函数的情况下,扩展其功能。Flask 使用装饰器来定义路由、请求前后钩子、中间件等。


1. Flask 装饰器的基本概念

Python 的装饰器本质上是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数。例如:

python">def my_decorator(f):def wrapper():print("调用前")f()print("调用后")return wrapper@my_decorator
def say_hello():print("Hello, Flask!")say_hello()

执行 say_hello() 时,输出:

调用前
Hello, Flask!
调用后

这里 @my_decorator 等价于 say_hello = my_decorator(say_hello)


2. Flask 中常见的装饰器

Flask 提供了一系列装饰器用于不同的功能,最常见的包括:

  • 路由装饰器
  • 请求前/后处理装饰器
  • 错误处理装饰器
  • Flask 扩展提供的装饰器

2.1 路由装饰器 @app.route

Flask 使用 @app.route 装饰器来注册 URL 路由,使某个函数在访问特定 URL 时被调用。

python">from flask import Flaskapp = Flask(__name__)@app.route('/')  # 访问根路径时执行
def home():return "欢迎来到 Flask 首页"@app.route('/about')
def about():return "关于页面"if __name__ == '__main__':app.run(debug=True)

这里的 @app.route('/') 本质上是 app.add_url_rule('/', 'home', home) 的简化写法。


2.2 处理 HTTP 请求方法

默认情况下,@app.route 只允许 GET 请求,你可以使用 methods 参数指定多个方法:

python">@app.route('/submit', methods=['GET', 'POST'])
def submit():if request.method == 'POST':return "收到 POST 请求"return "收到 GET 请求"

2.3 @app.before_request & @app.after_request

Flask 允许你在每个请求处理之前或之后执行代码,可以用来做权限校验、日志记录等。

(1) @app.before_request

@app.before_request 在请求到达视图函数之前执行,适合用来验证权限、日志记录等。

python">from flask import request@app.before_request
def before_request_func():print(f"正在处理请求: {request.path}")
(2) @app.after_request

@app.after_request 在视图函数执行后,返回响应之前执行,适合用来修改响应。

python">@app.after_request
def after_request_func(response):response.headers["X-Custom-Header"] = "FlaskDemo"return response

2.4 @app.errorhandler

用于处理特定的 HTTP 错误,例如 404、500。

python">@app.errorhandler(404)
def not_found_error(error):return "页面未找到", 404

3. 自定义 Flask 装饰器

除了 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": "成功访问受保护资源"})

当访问 /protected 时,如果请求头没有 Authorization,返回 401。


4. Flask 扩展中的装饰器

Flask 生态系统中的很多扩展也使用了装饰器,例如:

  • Flask-Login: @login_required
  • Flask-CORS: @cross_origin()
  • Flask-RESTful: @marshal_with()
  • Flask-Cache: @cache.cached(timeout=60)

示例(使用 Flask-Login 扩展):

python">from flask_login import login_required@app.route('/dashboard')
@login_required
def dashboard():return "欢迎来到控制面板"

总结

  1. Flask 装饰器是基于 Python 高阶函数实现的,用于扩展功能。
  2. 常见的 Flask 内置装饰器:
    • @app.route:定义 URL 路由
    • @app.before_request:在请求前执行
    • @app.after_request:在请求后执行
    • @app.errorhandler:处理错误
  3. 可以自定义装饰器,用于认证、日志等功能。
  4. Flask 扩展提供的装饰器(如 @login_required)增强了 Flask 的能力。😃

http://www.ppmy.cn/server/175827.html

相关文章

FPGA学习(二)——实现LED流水灯

FPGA学习(二)——实现LED流水灯 目录 FPGA学习(二)——实现LED流水灯一、DE2-115时钟源二、控制6个LED灯实现流水灯1、核心逻辑2、代码实现3、引脚配置4、实现效果 三、模块化代码1、分频模块2、复位暂停模块3、顶层模块 四、总结 一、DE2-115时钟源 DE2-115板子包含一个50MHz…

DataWhale 大语言模型 - GPT和DeepSeek模型介绍

本课程围绕中国人民大学高瓴人工智能学院赵鑫教授团队出品的《大语言模型》书籍展开,覆盖大语言模型训练与使用的全流程,从预训练到微调与对齐,从使用技术到评测应用,帮助学员全面掌握大语言模型的核心技术。并且,课程…

记第一次跟踪seatunnel的任务运行过程四——getJobConfigParser().parse()的动作

前绪 记第一次跟踪seatunnel的任务运行过程三——解析配置的具体方法getLogicalDag 正文 书接上文 ImmutablePair<List<Action>, Set<URL>> immutablePair getJobConfigParser().parse(null);在前一篇文章中说到getLogicDag()方法的第一行&#xff08;如…

删除二叉搜索树中的节点

本文参考代码随想录 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 删除节点需要考虑多种情况&#xff1a; 没…

鸿蒙 @ohos.arkui.node

鸿蒙 ohos.arkui.node 在鸿蒙开发中&#xff0c;ohos.arkui.node 模块提供了一系列用于构建和管理自定义节点的 API。这些 API 组织在一起&#xff0c;方便开发者进行导出和使用。本文将详细介绍 ohos.arkui.node 模块的功能和使用方法。 一、模块功能概述 ohos.arkui.node 模…

大语言模型微调和大语言模型应用的区别?

大语言模型微调和大语言模型应用的区别&#xff1f; 1. 定义与目标 微调&#xff08;Fine-tuning&#xff09; 目标&#xff1a;调整预训练模型&#xff08;如GPT、LLaMA、PaLM&#xff09;的参数&#xff0c;使其适应特定任务或领域。 核心&#xff1a;通过额外的训练&#x…

Linux的部分常用基础指令

目录 1. ls 指令 2. pwd命令 3. cd 指令 4. touch 指令 5. mkdir指令 6. rmdir指令&&rm指令 7. rm命令可以同时删除文件或目录 8. man指令 9. cp指令 10. mv指令 11. cat 指令 12. more指令 13. less 指令 14. head指令 15. tail 指令 16. find 指令 17. whi…

【Java--数据结构】优先级队列( PriorityQueue)

一. 优先级队列 1.1 优先级队列的概念 优先级队列是一种特殊的队列&#xff0c;它在入队时会根据元素的优先级进行排序&#xff0c;优先级最高的元素排在队列的前面&#xff0c;出队时会优先出队优先级最高的元素。 1.2 优先级队列的区别 &#xff08;1&#xff09;与普通…