信号和自定义信号
信号
信号就相当于是埋点,在执行到send这个方法的时候,就会执行信号中注册的函数。
一共有两个原生的信号:request_started 和 request_finished。
信号和请求扩展的区别再去,请求扩展是在响应函数前执行的函数,信号是在请求扩展之前执行的函数。从源码中可以看出来。
from flask import Flask,signals
app = Flask(__name__)
# 往信号中注册函数
def func(*args,**kwargs):
print('触发型号',args,kwargs)
signals.request_started.connect(func)
# 触发信号: signals.request_started.send()
@app.before_first_request
def before_first1(*args,**kwargs):
pass
@app.before_first_request
def before_first2(*args,**kwargs):
pass
@app.before_request
def before_first3(*args,**kwargs):
pass
@app.route('/',methods=['GET',"POST"])
def index():
print('视图')
return "ok"
if __name__ == '__main__':
app.__call__()
app.run()
自定义信号
from flask import Flask,signals
from flask.signals import _signals
app = Flask(import_name=__name__)
# 自定义信号
xxxxx = _signals.signal('xxxxx')
def func1(*args,**kwargs):
# print(sb,k)
print("我是信号")
def func(*args,**kwargs):
print('触发型号',args,kwargs)
# 自定义信号中注册函数
xxxxx.connect(func)
# 往信号中注册函数
signals.request_started.connect(func)
@app.route("/x")
def index():
# 触发信号
_signals.signal("request-started").send(app)
xxxxx.send("sb",k=123)
return 'Index'
if __name__ == '__main__':
app.run()