做用:Flask框架中的信号基于blinker,其主要就是让开发者能够在flask请求过程当中定制一些用户行为python
安装:pip install blinkerflask
内置信号:session
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在其中添加数据时,自动触发
使用内置信号:app
from flask import Flask,signals app = Flask(__name__) # 往信号中注册函数,函数名任意 def fun(*args,**kwargs): print('触发信号',args,kwargs) signals.request_started.connect(fun) @app.route('/') def index(): print('我是请求') return 'ok' if __name__ == '__main__': app.run() # 在内部源码中,执行了 request_started.send(self)表示发送信号
一个流程中的信号触发点(了解)框架
a. before_first_request b. 触发 request_started 信号 c. before_request d. 模板渲染 渲染前的信号 before_render_template.send(app, template=template, context=context) rv = template.render(context) # 模板渲染 渲染后的信号 template_rendered.send(app, template=template, context=context) e. after_request f. session.save_session() g. 触发 request_finished信号 若是上述过程出错: 触发错误处理信号 got_request_exception.send(self, exception=e) h. 触发信号 request_tearing_down
自定义信号:函数
from flask import Flask, current_app, flash, render_template from flask.signals import _signals app = Flask(import_name=__name__) # 自定义信号 xxxxx = _signals.signal('xxxxx') # 必须有一个位置参数,去接收他的发送者, def func(sender, *args, **kwargs): print(sender) # 自定义信号中注册函数 xxxxx.connect(func) @app.route("/x") def index(): # 触发信号,这里的第一个参数是发送者,第二个参数可选的话,必须是关键字参数 xxxxx.send('123123', k1='v1') return 'Index' if __name__ == '__main__': app.run()