当前位置: 首页 > article >正文

Flask中的装饰器

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


1. Flask 装饰器的基本概念

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 时被调用。

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 参数指定多个方法:

@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 在请求到达视图函数之前执行,适合用来验证权限、日志记录等。

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

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

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

2.4 @app.errorhandler

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

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

3. 自定义 Flask 装饰器

除了 Flask 内置的装饰器,你也可以自定义装饰器,例如:检查用户是否登录。

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 扩展):

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 的能力。😃

相关文章:

Flask中的装饰器

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

MySQL配置文件my.cnf详解

目前使用的服务器系统是CentOS8.5 ,针对MySql8.4的配置示例,自己根据实际情况修改。 安装MySql8.4时,MySql8.4没有默认的my.cnf,需要用户根据需要自行配置my.cnf文件,大概可看到下面这样的参数列表,可能不同版本的mysql参数多少会…...

SonarQube安装及结合IDEA使用详细教程(2025适配版)

一、环境验证与准备 JDK版本确认 PS C:\> java -version openjdk version "17.0.14" 2025-01-21 LTS OpenJDK Runtime Environment Zulu17.5615-CA (build 17.0.147-LTS) OpenJDK 64-Bit Server VM Zulu17.5615-CA (build 17.0.147-LTS)安装路径说明 主程序路径&a…...

2018年全国职业院校技能大赛高职组-计算机网络应用竞赛竞赛样题E卷

目录 总体规划 模块二:设备基础信息配置 模块三:网络搭建与网络冗余备份方案部署 模块四:移动互联网搭建与网优 模块五:出口安全防护与远程接入 总体规划 医院在进行网络部分信息化建设方案设计过程中,需要保证医院、血液中心通过社保网进行互连互通,同时满足献血中心与医…...

python列表基础知识

列表 创建列表 1.列表的定义:可变的,有序的数据结构,可以随时添加或者删除其中的元素 2.基本语法:字面量【元素1,元素2,元素3】使用[]创建列表 定义变量:变量名称【元素1,元素2&…...

vue echarts封装使用

echarts 尺寸自动调节 resize.js 柱状图 components/dashboard/lineChart.vue <template><div :class"className" :style"{height:height,width:width}" /> </template><script> import echarts from echarts require(echarts/…...

PTP协议赋能高精度时间同步网络

什么是PTP&#xff1f; PTP&#xff08;精确时间协议&#xff0c;Precision Time Protocol&#xff09; 是一种基于IEEE 1588标准的网络时间同步协议&#xff0c;旨在为分布式系统中的设备提供亚微秒级&#xff08;甚至纳秒级&#xff09;的高精度时钟同步。其核心目标是通过消…...

使用WireShark解密https流量

概述 https协议是在http协议的基础上&#xff0c;使用TLS协议对http数据进行了加密&#xff0c;使得网络通信更加安全。一般情况下&#xff0c;使用WireShark抓取的https流量&#xff0c;数据都是加密的&#xff0c;无法直接查看。但是可以通过以下两种方法&#xff0c;解密抓…...

MIDI,AI 3D场景生成技术

MIDI&#xff08;Multi-Instance Diffusion for Single Image to 3D Scene Generation&#xff09;是先进的3D场景生成技术&#xff0c;能在短时间内将单张图像转化为高保真度的3D场景。通过智能分割输入图像&#xff0c;识别出场景中的独立元素&#xff0c;再基于多实例扩散模…...

三分钟掌握视频剪辑 | 在 Rust 中优雅地集成 FFmpeg

前言 在当今的短视频时代&#xff0c;高效的视频剪辑已成为内容创作者和开发者的迫切需求。无论是裁剪视频开头结尾、提取高光时刻&#xff0c;还是制作 GIF、去除广告&#xff0c;剪辑都是必不可少的一环。 然而&#xff0c;批量处理大量视频并非易事&#xff0c;常见的挑战…...

Linux 快捷键 | 终端快捷键 / 键盘快捷键

注&#xff1a;本文为 “Linux 快捷键” 相关文章合辑。 英文引文&#xff0c;机翻未校。 未整理去重。 Linux 终端常用快捷键 组合键 ~~~~~~~ 功能描述Ctrl a光标移动到行首&#xff08;Ahead of line&#xff09;&#xff0c;相当于通常的 Home 键Ctrl b光标往回 (Back…...

allWebPlugin中间件自动适应Web系统多层iframe嵌套

应用背景 在Web项目集成开发中&#xff0c;经常遇到主页面嵌套iframe&#xff0c;甚至iframe内部页面嵌套iframe的应用场景。笔者在某大型招投标项目应用中就遇到这种应用。为了降低用户原有应用系统集成难度&#xff0c;实现无感集成&#xff0c;allWebPlugin中间件实现自动适…...

Spring boot3-Http Interface: 声明式编程

来吧 1.首先引入pom.xml依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 2.创建WebClientController控制器 import com.atguigu.boot3_07_http.serv…...

【C++课程学习】:C++中的IO流(istream,iostream,fstream,sstream)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 C学习笔记&#xff1a; https://blog.csdn.net/djdjiejsn/category_12682189.html 前言&#xff1a; 在C语…...

C语言实现冒泡排序,超详解

引言 用c语言实现使用冒泡排序 一、什么是冒泡排序 冒泡排序是一种简单的排序算法 基本原理 冒泡排序的基本思想是通过对数组中相邻元素的比较和交换&#xff0c;将最大&#xff08;或最小&#xff09;的元素逐步 “冒泡” 到数组的末尾&#xff08;或开头&#xff09;。它重…...

Flutter——Android与Flutter混合开发详细教程

目录 1.创建FlutterModule项目&#xff0c;相当于Android项目里面的module库&#xff1b;2.或者编辑aar引用3.创建Android原生项目3.直接运行跑起来 1.创建FlutterModule项目&#xff0c;相当于Android项目里面的module库&#xff1b; 2.或者编辑aar引用 执行 flutter build a…...

沐数科技数据开发岗笔试题2025

描述性统计 标准差 答案: A 解析: 标准差 衡量数据集中数值变化或离散程度的一种度量。它反映了数据集中的各个数值与数据集的平均值&#xff08;均值&#xff09;之间的偏离程度。标准差越大&#xff0c;表明数据的分布越分散&#xff1b;标准差越小&#xff0c;表明数据…...

【eNSP实战】配置Easy IP

拓图 要求&#xff1a; 在AR1配置Easy IP策略实现内网可以访问Internet主机IP如图所示&#xff0c;这里不做展示 AR1接口配置 interface GigabitEthernet0/0/0ip address 192.168.0.1 255.255.255.0 # interface GigabitEthernet0/0/1ip address 10.0.1.1 255.255.255.0 …...

让双向链表不在云里雾里

又来博客留下我的足迹了&#xff0c;哈哈哈&#xff0c;这次是对于双向链表的理解 目录 创建双向链表&#xff1a; 申请结点&#xff1a; 双向链表初始化&#xff1a; 双向链表插入结点&#xff1a; 双向链表删除结点&#xff1a; 双向链表的打印&#xff1a; 双向链表…...

【Python 语法】排序算法

十大排序算法比较类排序(Comparison Sort)快速排序(Quick Sort)归并排序(Merge Sort)堆排序(Heap Sort)希尔排序(Shell Sort)插入排序(Insertion Sort)冒泡排序(Bubble Sort)选择排序(Selection Sort)2. 非比较类排序(Non-Comparison Sort)计数排序(Countin…...

SpringCloudAlibaba项目搭建

版本关系 我这一套用的是&#xff1a; mySQL版本 5.5.15 boot版本 2.2.13.RELEASE cloud版本 Hoxton.RELEASE cloud alibaba版本 2.2.0 nacos openFeign Gateway sentinel seata的pom赖版本为cloudAlibaba默认的 nacos 客户端版本 1.1.4 sentinel dashboard版本 1.7.1 s…...

Oracle VirtualBox安装CentOS 7

Oracle VirtualBox虚拟机安装CentOS 7 该文章记录了在Windows上使用Oracle公司&#xff08;甲骨文&#xff09;的Virtual Box安装CentOS 7的过程中&#xff0c;所遇到到的一些困难和解决方案。 目录 Oracle VirtualBox虚拟机安装CentOS 7一、前期准备工作1.Virtual Box2.Cent…...

linux docker 安装dify本地运行,及部署后运行出现502问题

1、git 拉取代码:git&#xff08; https://github.com/langgenius/dify.git&#xff09; git clone https://github.com/langgenius/dify.git2、进入项目目录 的docker下 cd docker3、复制一份本地运行的环境 cp .\.env.example .env查看本地的端口&#xff1a;80和443端口…...

计算机网络——DHCP

一、什么是DHCP&#xff1f; DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09; 是一种网络管理协议&#xff0c;用于自动分配IP地址、子网掩码、网关、DNS等网络参数给客户端设备。它像一个“智能管家”&#xff0c;让设备无需手…...

kettle ETL 配置

pdi-ce-9.1.0.0-324 配置-CSDN博客 3、配置中文字符 3.1&#xff09; spoon支持中文字符&#xff0c; spoon.bat启动文件加 -Dfile.encodingutf-8 REM %SPOON_START_OPTION% "%_PENTAHO_JAVA%" %JAVA_ADD_OPENS% %OPT% -jar launcher\launcher.jar -lib ..\%LIBSPAT…...

LeetCode 3280 将日期转换为二进制表示

【算法实战】日期转二进制&#xff1a;两种解法的思路与优化&#xff08;附代码解析&#xff09; 一、问题描述 给定一个yyyy-mm-dd格式的日期字符串&#xff0c;要求将年、月、日分别转为无前导零的二进制&#xff0c;并保持year-month-day格式。 示例&#xff1a;输入2025-…...

基于Java+MySQL实现的医药销售管理系统

医药销售管理系统 开发环境和开发工具 操作系统&#xff1a;win8.1 开发环境&#xff1a;Mysql、Web 开发工具&#xff1a;Workbench、Eclipse、JDBC 功能需求分析 员工有权查看、添加会员&#xff0c;查看、添加供应商&#xff0c;查询药品&#xff08;输入药品编号或名称…...

HTML 列表:构建清晰结构的网页内容

引言 在网页开发过程中&#xff0c;将信息有条理地呈现给用户至关重要。HTML 列表作为一种强大的工具&#xff0c;能够使内容更加结构化和易于阅读。HTML 提供了有序列表、无序列表和自定义列表三种类型&#xff0c;满足不同场景下的内容展示需求。本文将深入探讨这三种列表的…...

【DeepSeek应用】DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI助理,无惧任务提交失败的压力。 一、环境准备 1. 安装依赖库 …...

基于“动手学强化学习”的知识点(六):第 19 章 目标导向的强化学习(gym版本 >= 0.26)

第 19 章 目标导向的强化学习&#xff08;gym版本 &#xff1e; 0.26&#xff09; 摘要 摘要 本系列知识点讲解基于动手学强化学习中的内容进行详细的疑难点分析&#xff01;具体内容请阅读动手学强化学习&#xff01; 对应动手学强化学习——目标导向的强化学习 import torch…...