FLASK信号

使用信号分为3步,第一是定义一个信号,第二是监听一个信号,第三是发送一个信号。

自定义信号示例

from blinker import Namespace

 # Namespace:命名空间,防止多个信号冲突
 1. 定义信号
 sspace = Namespace()
 fire_signal = sspace.signal('fire')

 # 2. 监听信号
 def fire_bullet(sender):
     print(sender)
     print('start fire bullet')
 fire_signal.connect(fire_bullet)

 # 3. 发送一个信号
 fire_signal.send()  # 这里默认传给sender一个None

 

已经定义好的信号

  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`方法的信号。

 

from flask import template_rendered, got_request_exception

# 每个信号传的值不同
 def template_rendered_func(sender,template,context): # 处理信号
     print('sender:',sender)
     print('template:',template)
     print('context:',context)
 template_rendered.connect(template_rendered_func)  # 发信号

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


# 也可以通过装饰器订阅
@template_rendered.connect_via(app)
def when_template_rendered(sender, template, context, **extra):
    print 'Template %s is rendered with %s' % (template.name, context)
示例