Flask框架之视图中加装饰器

13 篇文章 0 订阅

1. 视图加装饰器

1.1 装饰器的位置

见如下代码

from flask import Flask

app = Flask(__name__)

def wrapper(func):
    def inner(*args,**kwargs):
        print('beforeFunc')
        ret = func(*args,**kwargs)
        return ret
    return inner



@app.route('/index')
@wrapper
def index():
    return 'index页面'

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

注意:
  1.重点是添加的装饰器的位置,wrapper装饰器必须要在route/路由装饰器下面,这样才能保证每次访问/index路径的时候能成功执行wrapper装饰器实现的功能
  2.就相当于route下面的代码段作为一个整体被route/路由装饰器装饰
  3.route装饰器,装饰的函数实际上是inner函数(因为执行index函数的时候相当于把inner传入了wrapper装饰器,返回了inner),所以route实际上装饰的是后来返回的inner函数

存疑问题:
  需要注意的是,由于route装饰器装饰的都是inner函数,若endpoint参数没有赋值定义别名,此时实际上对应的是函数名inner(注意,不是index而是inner);此时如果有了另一个视图函数如user函数做同样的装饰,那么再通过inner反解URL的时候,就无法确定是返回index还是user了;相当于重名了,此时Flask就无法运行

此时就需要functools.wraps方法来解决该问题


1.2 解决inner函数名问题

from functools import wraps

如下代码

from flask import Flask
from functools import wraps

app = Flask(__name__)

def wrapper(func):
    @wraps(func)
    def inner(*args,**kwargs):
        print('beforeFunc')
        ret = func(*args,**kwargs)
        return ret
    return inner

@app.route('/index')
@wrapper
def index():
    return 'index页面'

@app.route('/user')
@wrapper
def user():
    return 'user页面'

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

  通过functools.wraps装饰器,可以返回所有被装饰的视图函数本身的一些属性值(如,函数名__name__),这样就解决了上述描述的因endpoint参数默认值情况下,导致的反解URL的时候均是inner函数名的情况

2. 总结

  1. 自己定义的装饰器都要放在route/路由装饰器下面
  2. 通过functools.wraps来解决路由反解问题;一般情况下装饰器必用即可
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值