Flask学习(五):flask中添加装饰器

一、注意装饰器函数所在的位置:

代码示例如下:

python 复制代码
from flask import Flask

app = Flask(__name__)


def wapper(func):
    def inner(*args, **kwargs):
        print("执行了装饰器")
        return func(*args, **kwargs)

    return inner


@wapper
@app.route("/index1")
def index():
    return "Index"


if __name__ == "__main__":
    app.run()

执行结果:

由上述代码执行结果可知,装饰器wapper并没有被执行到,这是由于请求过来之后,执行完index并返回视图,因为wapper装饰器在app.route上面,所以并未执行到wapper装饰器,若想执行wapper装饰器,则需要将wapper放到route下面。

python 复制代码
@app.route("/index1")
@wapper
def index():
    return "Index"

执行结果如下:

由上述程序执行结果可知,当装饰器wapper放到route下面的时候,route会把装饰器wapper和index函数当做一个整体去执行,因此按照装饰器的执行顺序,就会先执行wapper返回inner函数引用,然后在执行请求,返回视图。

二、由第一条衍生出第二个问题,当多个请求共同被一个装饰器装饰的时候,程序会出现错误,示例及结果如下:

python 复制代码
from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)


def wapper(func):
    def inner(*args, **kwargs):
        print("执行了装饰器")
        return func(*args, **kwargs)

    return inner


@app.route("/index1")
@wapper
def index():
    return "Index"

@app.route("/index2")
@wapper
def index2():
    return "Index"


if __name__ == "__main__":
    app.run()

执行结果:

这是因为两个请求被一个装饰器装饰,执行装饰器后返回的是同样的inner函数的引用,因此存在两个inner函数,故而程序会报错,如果需要解决此问题就需要在执行装饰器的时候返回的函数引用是传入的函数参数,而不是内部闭包函数。因此需要在装饰器函数的内部函数上添加@functools.wraps(func)

@functools.wraps(func) (作用是在装饰函数时保留被装饰函数的元数据,比如函数名、注释、参数列表等。因为装饰器通常会改变函数的元数据,导致被装饰函数的某些特性丢失),代码如下所示:

python 复制代码
def wapper(func):
    def inner(*args, **kwargs):
        print("执行了装饰器")
        return func(*args, **kwargs)

    return inner
相关推荐
10年前端老司机5 分钟前
实战分享:基于 PyMuPDF+Qwen-VL 实现图文兼容的 PDF RAG 方案
人工智能·python·agent
扶风ff9 分钟前
求职笔试资料太散?用练题簿在线刷题,按岗位整理练习清单
前端·学习·小程序
2601_9628857211 分钟前
如何用 Python 回测定投策略(定期定额 DCA)?(和一次性买入对比)
开发语言·人工智能·python
蜗牛互联网11 分钟前
Python接入Gemini 3.8 Flash实现票据视觉抽取与规则校验
java·javascript·网络·人工智能·python
小小张说故事13 分钟前
Python 虚拟环境到底怎么选?venv/conda/pipenv/poetry 一张对比表 + 9 个踩坑
python
在世修行18 分钟前
干货:配置持久化与引擎状态的可视化
python·可视化·持久化
虎大猫猫39 分钟前
Python教程——按位取反的原理
开发语言·python
泡茶喝茶写代码1 小时前
A股量化数据工程:从 REST 接口到策略信号(第 4 篇):行业与概念板块树构建
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据api
2601_962780911 小时前
需求预测校招能力栈|2026 届 JD 梳理、日常任务、面试题与备考方案
python·数据挖掘·数据分析
乌暮1 小时前
JVM 原理与实践:从运行时数据区到线上故障排查
java·开发语言·jvm·后端·学习·面试