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
)。这些改变了应用程序(或者蓝图)的行为。 - 一般来说,钩子用于改变行为(比如,身份验证或错误处理),而信号用于记录事件(比如记录日志)。
信号操作
- 定义信号
- 订阅(监听)信号
- 发送信号
内置信号
template_rendered:模版渲染完成后的信号。
before_render_template:模版渲染之前的信号。
request_started:模版开始渲染。
request_finished:模版渲染完成。
request_tearing_down:request对象被销毁的信号。
got_request_exception:视图函数发生异常的信号。一般可以监听这个信号,来记录网站异常信息。
appcontext_tearing_down:app上下文被销毁的信号。
appcontext_pushed:app上下文被推入到栈上的信号。
appcontext_popped:app上下文被推出栈中的信号
message_flashed:调用了Flask的
flashed
方法的信号。
与自定义信号的使用方法一致
1 | from flask import got_request_exception |
访问hello_world视图函数,服务器发出一个异常信号,再经过flask内置信号机制到request_exception_log()函数处理,打印异常信息!