简单了解信号
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}