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
相关推荐
“AI国潮设计-小江”5 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
Linux_cy6 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi12036 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性
code tsunami6 小时前
【无标题】
开发语言·python
CodeGL6 小时前
10、Python基础之进程和线程
开发语言·python
Young Doro7 小时前
独立性检测学习任务
人工智能·学习·数据挖掘
TechWayfarer7 小时前
PHP漏洞被利用,怎么揪出攻击IP?
开发语言·python·tcp/ip·网络安全·php
2601_967980118 小时前
Python列表操作方法详解
python·数据类型·修改·列表操作·功能汇总
卡卡~~9 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
Patrick在香港9 小时前
台风在变少,来香港的没有
python·数据分析·香港·开放数据·热带气旋