装饰器应用解析

简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。
一般而言,我们要想拓展原来函数代码,最直接的办法就是侵入代码里面修改,例如:
import time
def func():
print(“hello”)
time.sleep(1)
print(“world”)

这是我们最原始的的一个函数,然后我们试图记录下这个函数执行的总时间,那最简单的做法就是:
#原始侵入,篡改原函数
import time
def func():
startTime = time.time()
print(“hello”)
time.sleep(1)
print(“world”)
endTime = time.time()
msecs = (endTime - startTime)*1000
print(“time is %d ms” %msecs)

import time

print("---------------------无参数的装饰器--------------------------")
def deco(func):
def wrapper():
startTime = time.time()
func()
endTime = time.time()
msecs = (endTime - startTime)*1000
print(“time is %d ms” %msecs)
return wrapper
@deco
def func():
print(“hello”)
time.sleep(1)
print(“world”)
if name == ‘main’:
f = func #这里f被赋值为func,执行f()就是执行func()
f()

print("---------------------带有参数的装饰器--------------------------")
#带有参数的装饰器
def deco1(func):
def wrapper(a,b):
startTime = time.time()
func(a,b)
endTime = time.time()
msecs = (endTime - startTime)*1000
print(“time is %d ms” %msecs)
return wrapper
@deco1
def func(a,b):
print(“hello,here is a func for add :”)
time.sleep(1)
print(“result is %d” %(a+b))
if name == ‘main’:
f = func
f(3,4)
#func()

print("---------------------带有不定参数的装饰器--------------------------")

def deco2(func):
def wrapper(*args, **kwargs):
startTime = time.time()
func(*args, **kwargs)
endTime = time.time()
msecs = (endTime - startTime)*1000
print(“time is %d ms” %msecs)
return wrapper
@deco2
def func(a,b):
print(“hello,here is a func for add :”)
time.sleep(1)
print(“result is %d” %(a+b))
@deco2
def func2(a,b,c):
print(“hello,here is a func for add :”)
time.sleep(1)
print(“result is %d” %(a+b+c))
if name == ‘main’:
f = func
func2(3,4,5)
f(3,4)
#func()

print("---------------------多个装饰器--------------------------")
#多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身
def dec1(func):
print(“1111”)
def one():
print(“2222”)
func()
print(“3333”)
return one
def dec2(func):
print(“aaaa”)
def two():
print(“bbbb”)
func()
print(“cccc”)
return two
@dec1
@dec2
def test():
print(“test test”)
test()
‘’’
装饰器的外函数和内函数之间的语句是没有装饰到目标函数上的,而是在装载装饰器时的附加操作。

85~86行是装载装饰器的过程,相当于执行了test=dect1(dect2(test)),此时先执行dect2(test),
结果是输出aaaa、将func指向函数test、并返回函数two,然后执行dect1(two),结果是输出1111、
将func指向函数two、并返回函数one,然后进行赋值。

用函数替代了函数名test。 22行则是实际调用被装载的函数,这时实际上执行的是函数one,
运行到func()时执行函数two,再运行到func()时执行未修饰的函数test。
‘’’

参考:
https://www.jb51.net/article/176696.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python JWT装饰器是一种用于验证和解析JSON Web Tokens(JWT)的装饰器。JWT是一种用于在网络应用中传递信息的开放标准(RFC 7519)。它由三部分组成:头部、载荷和签名。 在Python中,可以使用PyJWT库来处理JWT。下面是一个简单的示例,展示了如何使用JWT装饰器来验证和解析JWT: ```python import jwt from functools import wraps from flask import request, jsonify def jwt_required(func): @wraps(func) def decorated(*args, **kwargs): token = None if 'Authorization' in request.headers: token = request.headers['Authorization'].split()[1] if not token: return jsonify({'message': 'Token is missing!'}), 401 try: data = jwt.decode(token, 'secret_key') # 在这里可以对解码后的数据进行进一步的验证或处理 except jwt.ExpiredSignatureError: return jsonify({'message': 'Token is expired!'}), 401 except jwt.InvalidTokenError: return jsonify({'message': 'Invalid token!'}), 401 return func(*args, **kwargs) return decorated ``` 上述代码定义了一个`jwt_required`装饰器,它可以应用于需要进行JWT验证的路由函数上。在装饰器内部,首先从请求头中获取JWT,然后使用`jwt.decode`方法对其进行解码。如果解码成功,则可以对解码后的数据进行进一步的验证或处理。如果解码失败,则返回相应的错误响应。 使用该装饰器的示例代码如下: ```python from flask import Flask app = Flask(__name__) @app.route('/protected') @jwt_required def protected_route(): return jsonify({'message': 'This is a protected route!'}) if __name__ == '__main__': app.run() ``` 在上述示例中,`protected_route`函数被`jwt_required`装饰器修饰,表示该路由需要进行JWT验证。如果请求中的JWT验证通过,则返回一个包含保护资源的JSON响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值