装饰器的应用场景
# 1. 测试代码的运行时间
import time def outter(func): def inner(*args,**kwargs): s = time.time() func() e = time.time() return e - s return inner @outter def demo(): for i in range(1000000): pass t = demo() print(t)
# 结果
0.022935152053833008
# 2. 限制访问
from flask import Flask,request app = Flask(__name__) @app.route("/") def index(): print(request.host) print(request.host_url) # 怎么设置一个逻辑,同一个host一秒钟访问次数超过10次,认为是非人为操作,然后拉入黑名单,12个小时候才能继续访问。 # 方式一,将访问的ip插入到redis中,设置过期时间为1/10s,若插入成功,就可以继续访问,插入失败就返回请求过于频繁。 # 对每一个网页的话都限制IP的话,就要封装一个装饰器,请求前先进行ip检查,flask中的请求钩子,before_request,是否合理 # 方式二, return "welcome to flask" if __name__ == '__main__': app.run(debug=True)
# 3. 判断是否是登录的状态
# 4. 装饰类,创建单例模式
# 普通装饰器
# 单例案例:
![](https://img2018.cnblogs.com/common/1749518/201912/1749518-20191202134053442-1568507333.png)
存在的问题:这种情况下装饰的类,不能被外界引用 # 特殊装饰器