什么是信号?信号可以帮助我们消除flask核心框架或者扩展应用之间的耦合,通过某个动作发生时发出通知消息来实现这个机制.简言之,信号允许特定的发送者在某事件发生时,发送通知消息给订阅者.
flask有一系列的信号和扩展来实现信号机制.请记住信号是发送给订阅者的,订阅者无权修改数据.你会发现某些信号的功能和内置的渲染器很类似(例如:request_started类似于before_request()).但是她们的工作机理又有所不同.before_request()按照特定的顺序来处理,并且可以在不产生响应的情况下退出.
信号的最大的益处就是你可以分片段的来订阅,这种分段的订阅机制对单元测试来说非常有用.
订阅信号
可以用connect()方法来订阅一个信号,第一个参数为回调函数,第二个可选参数为发送者.disconnect()方法解除订阅.
对于所有的flask信号,sender就是发送信号的应用。当你订阅一个信号的时候,务必填充sender,除非你想接收所有应用的消息。
下面是一个例子,这个例子可以指出单元测试中所渲染的模板,并且能给出传递到模板上的变量。
from flask import template_rendered from contextlib import contextmanager @contextmanager def captured_templates(app): recorded = [] def record(sender, template, context, **extra): recorded.append((template, context)) template_rendered.connect(record, app) try: yield recorded finally: template_rendered.disconnect(record, app)
如上,connect方法将record和app关联起来,record为回调函数,app作为发送者。