A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈泽 中级黑马   /  2019-8-29 09:54  /  977 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

    Flask 自 0.6 版本开始在内部支持信号。信号功能由优秀的 connected_to() )。它允许临时把一个使用环境对象的函数订阅到一个信号。因为环境对象的返回值不能被指定,所以必须把列表作为参数:   
[Python] 纯文本查看 复制代码
from flask import template_rendered

def captured_templates(app, recorded, **extra):
    def record(sender, template, context):
        recorded.append((template, context))
    return template_rendered.connected_to(record, app)

    上例可以这样使用:
   
[Python] 纯文本查看 复制代码
templates = []
with captured_templates(app, templates, **extra):
    ...
    template, context = templates[0]
       Blinker API 变化

    Blinker version 1.1 版本中增加了 Namespace 中命名信号:

   
[Python] 纯文本查看 复制代码
from blinker import Namespace
my_signals = Namespace()

    接着可以像这样创建新的信号:

   

[Python] 纯文本查看 复制代码
model_saved = my_signals.signal('model-saved')[/color][/p]

    信号的名称应当是唯一的,并且应当简明以便于调试。可以通过 name 属性获得信号的名称。
   
    扩展开发者注意

    如果你正在编写一个 Flask 扩展,并且想要妥善处理 blinker 安装缺失的情况,那么可以使用 send() 方法。它的第一个参数是一个发送者,其他参数要发送给订阅者的东西,其他参数是可选的:

   

[Python] 纯文本查看 复制代码
class Model(object):[/color][/p]    ...

    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() 装饰器轻松订阅信号:

   

[Python] 纯文本查看 复制代码
from flask import template_rendered[/color][/p]
@template_rendered.connect_via(app)
def when_template_rendered(sender, template, context, **extra):
    print 'Template %s is rendered with %s' % (template.name, context)

    核心信号

    Flask 中有以下信号:

flask.template_rendered 这个信号发送于一个模板被渲染成功后。信号传递的 template 是模板的实例, context 是环境对象是一个字典。

   订阅示例:

   

[Python] 纯文本查看 复制代码
def log_template_renders(sender, template, context, **extra):[/color][/p]    sender.logger.debug('Rendering template "%s" with context %s',
                        template.name or 'string template',
                        context)

from flask import template_rendered
template_rendered.connect(log_template_renders, app)
flask.request_started

     这个信号发送于请求开始之前,且请求环境设置完成之后。因为请求环境已经绑定, 所以订阅者可以用标准的全局代理,如 request 来操作请求。

订阅示例:
     

[Python] 纯文本查看 复制代码
def log_request(sender, **extra):[/color][/p]    sender.logger.debug('Request context is set up')

from flask import request_started
request_started.connect(log_request, app)
flask.request_finished

    这个信号发送于向客户端发送响应之前。信号传递的 response 为将要发送的响应。

    订阅示例:

   

[Python] 纯文本查看 复制代码
def log_response(sender, response, **extra):[/color][/p]    sender.logger.debug('Request context is about to close down.  '
                        'Response: %s', response)

from flask import request_finished
request_finished.connect(log_response, app)
flask.got_request_exception

    这个信号发送于请求进行中发生异常的时候。它的发送早于标准异常处理介于。 在调试模式下,虽然没有异常处理,但发生异常时也发送这个信号。信号传递的 exception 是异常对象。

    订阅示例:

   

[Python] 纯文本查看 复制代码
def log_exception(sender, exception, **extra):[/color][/p]    sender.logger.debug('Got exception during processing: %s', exception)

from flask import got_request_exception
got_request_exception.connect(log_exception, app)
flask.request_tearing_down
     这个信号发送于请求崩溃的时候,不管是否引发异常。目前,侦听此信号的函数在一般崩溃处理器后调用,但是没有什么东西可用。

     订阅示例:

     

[Python] 纯文本查看 复制代码
def close_db_connection(sender, **extra):[/color][/p]    session.close()

from flask import appcontext_tearing_down
request_tearing_down.connect(close_db_connection, app)

    在 Flask 版本 0.9 中,这还会传递一个 exc 关键字参数,如果这个参数存在的话。 这个参数是引发崩溃的异常的引用。

     flask.appcontext_tearing_down 当应用环境崩溃时发送这个信号。这个信号总是会发送,甚至是因为一个异常引发的 崩溃。侦听这个信号的函数会在常规崩溃处理器后被调用,但是你无法回馈这个信号。

    订阅示例:

     
[Python] 纯文本查看 复制代码
def close_db_connection(sender, **extra):
    session.close()

from flask import request_tearing_down
appcontext_tearing_down.connect(close_db_connection, app)

    这还会传递一个 exc 关键字参数,如果这个参数存在的话。这个参数是引发崩溃的异常的引用。

     flask.appcontext_pushed 当一个应用的环境被压入时,应用会发送这个信号。这个信号通常用于在单元测试中临时钩接信息。例如可以用于改变 g 对象中现存的资源。

     用法示例:

     
[Python] 纯文本查看 复制代码
from contextlib import contextmanager
from flask import appcontext_pushed

@contextmanager
def user_set(app, user):
    def handler(sender, **kwargs):
        g.user = user
    with appcontext_pushed.connected_to(handler, app):
        yield

    在测试代码中这样写:
   
[Python] 纯文本查看 复制代码
def test_user_me(self):
    with user_set(app, 'john'):
        c = app.test_client()
        resp = c.get('/users/me')
        assert resp.data == 'username=john'
New in version 0.10.

appcontext_popped

    当一个应用的环境被弹出时,应用会发送这个信号。这个信号通常写成 appcontext_tearing_down 信号。

    New in version 0.10.

    flask.message_flashed 当应用闪现一个消息时会发出这个信号。message参数是消息内容, category 参数是消息类别。

    订阅示例:

   

[Python] 纯文本查看 复制代码
recorded = [][/color][/p]def record(sender, message, category, **extra):
    recorded.append((message, category))

from flask import message_flashed
message_flashed.connect(record, app)
[p=26, null, left][color=rgb(102, 102, 102)]New in version 0.10.
     


   













0 个回复

您需要登录后才可以回帖 登录 | 加入黑马