flask信号
flask信号
什么是信号?
项目功能复杂,代码量越大,就越需要做业务解耦,我们在程序的某些环节发出信号,我们如果给这个信号绑定了方法,那么就会触发方法的执行。
flask框架的信号基于blinker模块,在框架的一些核心功能做扩展时,我们可以只让其执行一句发出信号的代码,扩展的功能写在别处。
pip install blinker
内置信号
基本使用
from flask import Flask
from flask import signals
# 1.定义一个函数
def exception_log(*args, **kwargs):
print('出错了,记录一下', args, kwargs)
app = Flask(__name__)
# 2.导入内置信号,并绑定函数
signals.got_request_exception.connect(exception_log)
@app.route('/')
def index():
# 3.执行到这里的时候自动触发函数
9 / 0
return 'hello world'
if __name__ == '__main__':
app.run()
flask内置信号总结
# 内置信号: flask少一些,django多一些
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在其中添加数据时,自动触发
自定义信号
-
定义出一个新的信号
信号名=_signals.signal('信号名')
-
写一个函数,并绑定自定义的信号
信号名.connect(函数)
-
自定义指定位置触发
信号名.send('可以传入一些参数,与函数所需参数对应')