Flask 提供了信号(Signals)功能,是一种消息分发机制。类似于钩子(Hooks)。使用信号功能可以降低程序的耦合,分解复杂的业务模型。例如在更新了产品数据后,可以发送一个信号。当有需要对产品数据进行处理的功能时,就可以捕获信号进行处理。比如要建立产品缓存,或是更新搜索索引等。

定义信号

Flask 信号功能使用了 Blinker 模块,所以需要先安装 Blinker 模块

pip install blinker

定义一个信号:

from blinker import Namespace

product_saved = Namespace()

也可以使用 Flask 包装的 singles 对象:

from flask.singles import Namespace

发送信号

发送信号需要带上 app 实例方法,示例如下:

product_saved.send(app, product=product)

app 后面可以添加要传递的参数,但必须以 name=value 的格式,不支持使用单个变量名的方式。

收接信号

接收信号可以使用 connect_via 装饰器函数:

@product_saved.connect_via(app)

def updateCache(app, product):

print(product)

Flask 中有以下核心信号:

1.flask.template_rendered

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

订阅示例:

def log_template_renders(sender, template, context, **extra):

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)

2.flask.request_started

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

订阅示例:

def log_request(sender, **extra):

sender.logger.debug('Request context is set up')

from flask import request_started

request_started.connect(log_request, app)

flask.request_finished

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

订阅示例:

def log_response(sender, response, **extra):

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是异常对象。

订阅示例:

def log_exception(sender, exception, **extra):

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

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

订阅示例:

def close_db_connection(sender, **extra):

session.close()from flask import appcontext_tearing_down

request_tearing_down.connect(close_db_connection, app)

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

3.flask.appcontext_tearing_down

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

订阅示例:

def close_db_connection(sender, **extra):

session.close()from flask import request_tearing_down

appcontext_tearing_down.connect(close_db_connection, app)

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

4.flask.appcontext_pushed

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

用法示例:

from contextlib import contextmanagerfrom

flask import appcontext_pushed

@contextmanagerdef user_set(app, user):

def handler(sender, **kwargs):

g.user = user

with appcontext_pushed.connected_to(handler, app):

yield

在测试代码中这样写:

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.

5.appcontext_popped

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

6.flask.message_flashed

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

订阅示例:

recorded = []def record(sender, message, category, **extra):

recorded.append((message, category))

from flask import message_flashed

message_flashed.connect(record, app)

小结

信号可以让你在一瞬间安全地订阅它们。例如,这些临时的订阅对测试很有帮助。使用信号时,不要让信号订阅者(接收者)发生异常,因为异常会造成程序中断。

更多Python的Flask框架中的signals信号机制相关文章请关注PHP中文网!

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

python处理信号机制_Python的Flask框架中的signals信号机制相关推荐

  1. python flask框架下登录注册界面_Python的Flask框架中实现简单的登录功能的教程

    Python 的 Flask 框架中实现简单的登录功能的教程 , 登录是各个 web 框架中的基础功能 , 需要的朋友可以参考下 回顾 在前面的系列章节中, 我们创建了一个数据库并且学着用用户和邮件来 ...

  2. python使用redis队列_Python的Flask框架应用调用Redis队列数据的方法

    任务异步化打开浏览器,输入地址,按下回车,打开了页面.于是一个HTTP请求(request)就由客户端发送到服务器,服务器处理请求,返回响应(response)内容. 我们每天都在浏览网页,发送大大小 ...

  3. python redis 消息队列_Python的Flask框架应用调用Redis队列数据的方法

    任务异步化打开浏览器,输入地址,按下回车,打开了页面.于是一个HTTP请求(request)就由客户端发送到服务器,服务器处理请求,返回响应(response)内容. 我们每天都在浏览网页,发送大大小 ...

  4. python安卓qq登录_Python的Flask框架应用程序实现使用QQ账号登录的方法

    Flask-OAuthlib是OAuthlib的Flask扩展实现, 项目地址: https://github.com/lepture/flask-oauthlib 主要特性: 支持OAuth 1.0 ...

  5. python日期选择框_Python的Django框架中设置日期和字段可选的方法

    设置字段可选 在摆弄了一会之后,你或许会发现管理工具有个限制:编辑表单需要你填写每一个字段,然而在有些情况下,你想要某些字段是可选的. 举个例子,我们想要Author模块中的email字段成为可选,即 ...

  6. html文件怎么用Python做后端,利用python实现后端写网页(flask框架).pdf

    利利用用python实实现现后后端端写写网网页页 ((flask框框架架)) 如何用python做后端写网页-flask框架 什么是Flask安装flask模块Hello World更深一步:数据绑 ...

  7. flask框架中的Jinja2模板引擎

    简介 在flask框架中通常使用Jinja2模板引擎来实现复杂页面的渲染. 本章主要介绍Jinja2模板引擎的基本结构和使用方法. 如何使用flask框架渲染模板 在模板中传递一个或者多个参数 if语 ...

  8. Flask 框架中 上下文基础理念,包括cookie,session存储方法,requset属性,current_app模块和g模块...

    Flask中上下文,分为请求上下文和应用上下文.既状态留存 ,就是把变量存在某一个地方可以调用 请求上下文:实际就是request和session用法理念,既都是可以存储东西. 应用上下文:既变量共享 ...

  9. python框架实例_Python之Flask框架项目Demo入门

    Flask是微型web框架,框架本身十分精简,微型并不代表其功能弱,核心代码基于Werkzeug, Jinja 2 这两个库,它以插件形式的进行功能扩展,且插件易于安装与使用,并且可以自行开发扩展插件 ...

最新文章

  1. Linux排障必备命令
  2. centos找不到环境变量 -bash: ls: command not found(亲测)
  3. Servlet和JSP之间的区别
  4. GitHub教程手册、使用流程
  5. mysql 结束符报错_【踩坑记录】MySQL 实现自定义递归函数
  6. 教你用Python 每日定时推送睡前小故事给你__的人
  7. 安卓应用安全指南 4.10 使用通知
  8. python threading.Semaphore
  9. qemu-kvm 代码分析
  10. 串的复制——串传送指令MOVSB和方向标志位DF和CLD和REP
  11. JavaWeb项目生成PDF文件添加水印图片并导出
  12. 31个省环境统计年鉴面板数据(2003-2019年)
  13. php 后台存cookie前台js中文读取cookie的办法
  14. nutch代码分析第一篇——综述
  15. 超搞笑,超拽的句子...
  16. Android听筒模式和免提模式的切换
  17. 高德poi获取之矩形搜索法(冲出900条限制)
  18. 迈德威视MV-SUA133GC-T工业相机驱安装
  19. 使用chrome调试手机,平板,pc上各种浏览器上的页面
  20. [Learn Gst] 工程结构

热门文章

  1. mysql空密码php_WAMP中如何修改mysql默认空密码_MySQL
  2. [javaweb] servlet-session 会话跟踪技术 与 session保存作用域 (三)
  3. Python字典(dict )的几种遍历方式
  4. python对文件进行压缩解压缩基于zip格式
  5. c语言24点游戏流程图,C语言解24点游戏程序
  6. 【图像处理】图像内插“最近邻插值 最近邻内插法(Nearest Neighbour Interpolate)”代码演示(调整图像大小、放大、缩小)
  7. 【中级软考】RSA、IDEA、RC4、MD5算法分别是什么?
  8. 使用 Jenkins 自动部署 java-web 应用到 Docker 容器(全过程)
  9. 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(DOM)
  10. php5.4 win10 mysql_win10本地搭建apache+php+mysql运行环境