简单了解信号
Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为。简单来说就是flask在列表里面,预留了几个空列表,在里面存东西。信号通过发送通知来帮助你解耦应用。简言之,信号允许某个发送者通知接收者有事情发生了;
|
1
|
pip3 install blinker |
一、 内置信号
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
request_started = _signals.signal('request-started') # 请求到来前执行request_finished = _signals.signal('request-finished') # 请求结束后执行before_render_template = _signals.signal('before-render-template') # 模板渲染前执行template_rendered = _signals.signal('template-rendered') # 模板渲染后执行got_request_exception = _signals.signal('got-request-exception') # 请求执行出现异常时执行request_tearing_down = _signals.signal('request-tearing-down') # 请求执行完毕后自动执行(无论成功与否)appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 请求上下文执行完毕后自动执行(无论成功与否)appcontext_pushed = _signals.signal('appcontext-pushed') # 请求上下文push时执行appcontext_popped = _signals.signal('appcontext-popped') # 请求上下文pop时执行message_flashed = _signals.signal('message-flashed') # 调用flask在其中添加数据时,自动触发 |
执行顺序源码示例
request_started
request_finished
before_render_template
template_rendered
got_request_exception
request_tearing_down
appcontext_tearing_down
appcontext_tearing_down
appcontext_pushed
appcontext_popped
message_flashed二、 自定义信号
第一步:创建信号
第二步:将函数注册到信号中: 添加到这个列表
第三步: 发送信号
第四步:运行
具体实现:可参考flask源码,写一个自定义信号
from flask import Flask,flash
from flask.signals import _signals
app = Flask(__name__)
xinhao = _signals.signal("xinhao")#创建信号
#定义函数
def wahaha(*args,**kwargs):
print("111",args,kwargs)
def sww(*args,**kwargs):
print("222",args,kwargs)
# 将函数注册到信号中,添加到这个列表
xinhao.connect(wahaha)
xinhao.connect(sww)
@app.route("/zzz")
def zzz():
xinhao.send(sender='xxx',a1=123,a2=456) #触发这个信号,执行注册到这个信号列表中的所有函数,此处的参数个数需要与定义的函数中的参数一致
return "发送信号成功"
if __name__ == '__main__':
app.run(debug=True)
#打印结果
# 111 (None,) {'sender': 'xxx', 'a1': 123, 'a2': 456}
# 222 (None,) {'sender': 'xxx', 'a1': 123, 'a2': 456}
