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

[Python] 纯文本查看 复制代码
?
1
2
3
4
5
6
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] 纯文本查看 复制代码
?
1
2
3
4
templates = []
with captured_templates(app, templates, **extra):
    ...
    template, context = templates[0]

    Blinker API 变化

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

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

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

[Python] 纯文本查看 复制代码
?
1
<font style="color:rgb(102, 102, 102)">model_saved = my_signals.signal('model-saved')[/color][/p]</font>

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

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

[Python]  纯文本查看  复制代码
?
1
2
3
4
5
<font style = "color:rgb(102, 102, 102)" > class Model( object ):[ / color][ / p]    ...
     def save( self ):
         model_saved.send( self )
< / font>

请谨慎选择发送者。如果是一个发送信号的类,请把 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]  纯文本查看  复制代码
?
1
2
3
4
5
<font style = "color:rgb(102, 102, 102)" > 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)
< / font>

    核心信号

Flask 中有以下信号:

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

订阅示例:

[Python]  纯文本查看  复制代码
?
1
2
3
4
5
6
7
<font style = "color:rgb(102, 102, 102)" > 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< / font>

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

订阅示例:

[Python]  纯文本查看  复制代码
?
1
2
3
4
5
<font style = "color:rgb(102, 102, 102)" > 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< / font>

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

订阅示例:

[Python]  纯文本查看  复制代码
?
1
2
3
4
5
6
<font style = "color:rgb(102, 102, 102)" > 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< / font>

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

订阅示例:

[Python]  纯文本查看  复制代码
?
1
2
3
4
5
<font style = "color:rgb(102, 102, 102)" > 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< / font>

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

订阅示例:

[Python]  纯文本查看  复制代码
?
1
2
3
4
<font style = "color:rgb(102, 102, 102)" > def close_db_connection(sender, * * extra):[ / color][ / p]    session.close()
from flask import appcontext_tearing_down
request_tearing_down.connect(close_db_connection, app)< / font>

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

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

订阅示例:

[Python]  纯文本查看  复制代码
?
1
2
3
4
5
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]  纯文本查看  复制代码
?
1
2
3
4
5
6
7
8
9
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]  纯文本查看  复制代码
?
1
2
3
4
5
6
7
8
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]  纯文本查看  复制代码
?
1
2
3
4
5
6
<font style = "color:rgb(102, 102, 102)" >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 .< / font>

Flask信号的使用相关推荐

  1. python处理信号机制_Python的Flask框架中的signals信号机制

    Flask 提供了信号(Signals)功能,是一种消息分发机制.类似于钩子(Hooks).使用信号功能可以降低程序的耦合,分解复杂的业务模型.例如在更新了产品数据后,可以发送一个信号.当有需要对产品 ...

  2. flask中的信号机制

    2019独角兽企业重金招聘Python工程师标准>>> flask中信号机制 Flask信号允许特定的发送端通知订阅者发生了什么.既然知道发生了什么,那我们可以知道接下来该做什么了. ...

  3. Python 强大的信号库 blinker 入门教程

    作者:金色旭光 来源:https://www.cnblogs.com/goldsunshine/p/15426970.html 1 信号 信号是一种通知或者说通信的方式,信号分为发送方和接收方.发送方 ...

  4. Flask全套知识点从入门到精通,学完可直接做项目

    目录 Flask入门 运行方式 URL与函数的映射(动态路由) PostMan的使用 查询参数的获取 上传文件 其它参数 url_for 函数 响应-重定向 响应-响应内容 响应-自定义响应 Flas ...

  5. 强大的 Python 信号库:blinker 入门教程

    这是「进击的Coder」的第 543 篇技术分享 作者:金色旭光 来源:https://www.cnblogs.com/goldsunshine/p/15426970.html " 阅读本文 ...

  6. 老男孩python全栈9期全套视频_[全套视频] 老男孩Python全栈7期:Flask全套组件及原理剖析视频教程,全套视频教程学习资料通过百度云网盘下载...

    目录├─1398 T* * I K, E% T│ ├─01 python fullstack s7day139 课前分享之找一个对标的人.mp4│ ├─02 python fullstack s7da ...

  7. Flask高级(四)

    目录 前言 Flask_信号机制 信号机制 自定义信号步骤 创建信号 监听信号 发送信号 小结 Flask信号使用场景_存储用户登录日志 信号使用场景 导入所需模块和函数和创建登录信号 记录登录信息( ...

  8. flask-session总结

    一.session       session和cookie的原理和区别: cookie是保存在浏览器上的键值对              session是存在服务端的键值对(服务端的session就 ...

  9. linux bam文件格式,pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)...

    在开发基因组相关流程或工具时,经常需要读取.处理和创建bam.vcf.bcf文件.目前已经有一些主流的处理此类格式文件的工具,如samtools.picard.vcftools.bcftools,但此 ...

最新文章

  1. 速算C语言程序设计,C语言程序设计课程设计-速算24.doc
  2. 每个软件工程师都应该尝试的5件事
  3. EXCEL的下拉列表
  4. mysql复杂操作,.Net Core+mySqlSugar的一些稍复杂操作
  5. mysql 日期查询今天_Mysql 日期查询今天、昨天、近7天、近30天、本月、上一月、本季...
  6. machine id linux,linux – 机器ID是uuid吗?
  7. React Native实例
  8. SparkStreaming之transform
  9. iOS图片高斯模糊处理
  10. 阿里销售铁军:阿里巴巴客户跟进流程
  11. c语言标志位flag怎么用,怎么用flag标志位当单片机中断标志来用
  12. 品致高频电流探头的主要特点和连接示波器
  13. 一个农村孩子的大城市梦想之深入江湖!
  14. vue请求拦截 给所有的api接口的请求 params 带上一个存储的值及qs的安装
  15. 手把手教你使用Keras进行人脸检测和识别
  16. 网络编程之FTP文件传输协议
  17. 生物信息学算法之Python实现|Rosalind刷题笔记:013 随机DNA序列
  18. Taro3.2 适配 React Native 之运行时架构详解
  19. arcgis 导入 GML文件
  20. 有限体积法(6)——离散格式的特性

热门文章

  1. MathType可以编辑带圈乘号吗
  2. 生活在上海的22个风花雪月的场所和行动 [ZT]
  3. php把数字月份转汉字月份,php如何实现月份转换
  4. exchange server2003与chkdsk
  5. Matlab Mathematica MathCAD Maple比较(转载)
  6. esp32与android蓝牙,ESP32蓝牙架构(官方)_esp32蓝牙,esp32如何连接手机蓝牙
  7. (转)Ubuntu 9.10 安装amule 关联firefox 以及加装反吸血模块
  8. 函数调用:传值与传址
  9. 洪江区:未雨绸缪 开展“敲门行动”森林防火宣传
  10. 分享一个坦克发射炮弹击中目标的程序