插件blinker实现信号与槽.
# 创建信号
from blinker import Namespace
_signals=Namespace()
saved=_signals('saved') # 创建名为saved的信号
# 槽函数
def on_saved(sender):
print(f'捕获到{sender}发来的信号')
# 连接信号与槽
saved.connect(on_saved)
# 发送信号
saved.send(self)
flask中信号与槽
flask.signals.py文件中定义了常用的信号
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在其中添加数据时,自动触发
使用内置信号.和自定义信号.本质是一样的.
# 定义槽函数
from flask.signals import message_flashed
def on_msg_flashed(*args,**kwargs):
print('触发信号',args,kwargs)
# 绑定给信号
message_flashed.connect(on_msg_flashed)
# 发送信号
@bp.route('/')
def hello_world(): # put application's code here
flash('hello world')
message_flashed.send() #######
return 'Hello World!'
自定义flask信号
from flask.signals import _signals
# 自定义信号
my_test_signal1=_signals.signal('my_test_signal1')
# 定义信号对应槽函数
def on_my_test_signal1(sender,*args,**kwargs):
print('触发信号',sender,args,kwargs)
# 连接信号与槽
my_test_signal1.connect(on_my_test_signal1)
# 触发信号
@bp.route('/signal1')
def signal_test1():
my_test_signal1.send('123333',k1='yancy')
return 'sent'
# 运行后,浏览器输入http://127.0.0.1:5000/signal1
# 打印结果: 触发信号 123333 () {'k1': 'yancy'}