笨鸟编程-零基础入门Pyhton教程

 找回密码
 立即注册

信号

发布者: 笨鸟自学网



创建信号

如果你想要在自己的应用中使用信号,你可以直接使用 blinker 库。最常见的用法 是在自定义的 Namespace 中命名信号。这也是大多数时候 推荐的做法:

from blinker import Namespace
my_signals = Namespace()

现在你可以这样创建新的信号:

model_saved = my_signals.signal('model-saved')

这里使用唯一的信号名,简化调试。可以用 name 属性来访问信号名。

给扩展开发者

如果你在编写一个 Flask 扩展并且你想优雅地在没有 blinker 安装时退化,你可以用 flask.signals.Namespace 这么做。

发送信号

如果你想要发出信号,调用 send() 方法可以做到。 它接受发送端作为第一个参数,和一些推送到信号订阅者的可选关键字参数:

class Model(object):
    ...

    def save(self):
        model_saved.send(self)

永远尝试选择一个合适的发送端。如果你有一个发出信号的类,把 self 作为发送 端。如果你从一个随机的函数发出信号,把 current_app._get_current_object() 作为发送端。

传递代理作为发送端

永远不要向信号传递 current_app 作为发送端,使用 current_app._get_current_object() 作为替代。这样的原因是, current_app 是一个代理,而不是真正的应用对象。

信号与 Flask 的请求上下文

信号在接收时,完全支持 请求上下文 。上下文本地的变量在 request_started 和 request_finished 一贯可用, 所以你可以信任 flask.g 和其它需要的东西。注意 发送信号 和 request_tearing_down 信号中描述的限制。

基于装饰器的信号订阅

你可以在 Blinker 1.1 中容易地用新的 connect_via() 装饰器订阅信号:

from flask import template_rendered

@template_rendered.connect_via(app)
def when_template_rendered(sender, template, context, **extra):
    print 'Template %s is rendered with %s' % (template.name, context) 

上一篇:记录应用错误下一篇:即插视图

Archiver|手机版|笨鸟自学网 ( 粤ICP备20019910号 )

GMT+8, 2024-10-18 14:35 , Processed in 0.015578 second(s), 17 queries .

© 2001-2020

返回顶部