https://blog.csdn.net/feit2417/article/details/80735643

https://segmentfault.com/a/1190000002454953

  • 什么是信号?信号通过发送发生在核心框架的其它地方或 Flask 扩展的动作时的通知来帮助你解耦应用。
  • 简而言之,信号允许特定的发送端通知订阅者发生了什么。

信号和钩子的区别

  • 信号似乎和一些内置的 装饰器做同样的事(如:request_started 与 before_request() 十分相似)。然而它们工作的方式是有差异的。
  • 譬如核心的before_request()处理程序以特定的顺序执行,并且可以在返回响应之前放弃请求。相比之下,所有的信号处理器是无序执行的,并且不修改任何数据。
  • Flask钩子(通常出现在蓝图或应用程序现存的方法中,比如一些内置装饰器,例如before_request)不需要Blinker库并且允许你改变请求对象(request)或者响应对象(response)。这些改变了应用程序(或者蓝图)的行为。
  • 一般来说,钩子用于改变行为(比如,身份验证或错误处理),而信号用于记录事件(比如记录日志)。

信号操作

  • 定义信号
  • 订阅(监听)信号
  • 发送信号

内置信号

  1. template_rendered:模版渲染完成后的信号。

  2. before_render_template:模版渲染之前的信号。

  3. request_started:模版开始渲染。

  4. request_finished:模版渲染完成。

  5. request_tearing_down:request对象被销毁的信号。

  6. got_request_exception:视图函数发生异常的信号。一般可以监听这个信号,来记录网站异常信息。

  7. appcontext_tearing_down:app上下文被销毁的信号。

  8. appcontext_pushed:app上下文被推入到栈上的信号。

  9. appcontext_popped:app上下文被推出栈中的信号

  10. message_flashed:调用了Flask的flashed方法的信号。

与自定义信号的使用方法一致

1
2
3
4
5
6
7
8
9
10
from flask import got_request_exception

def request_exception_log(sender,exception):
print(exception)
got_request_exception.connect(request_exception_log)

@app.route('/')
def hello_world():
a = 1/0
return render_template('index.html')

访问hello_world视图函数,服务器发出一个异常信号,再经过flask内置信号机制到request_exception_log()函数处理,打印异常信息!