Flask中有内置的一些信号,也可以通过三方库blinker自定义信号,其实Flask内置的信号也是优先使用的blinker库,如果没有安装blinker才会使用自定义的信号机制。可以通过点击任意导入的内置信号查看源码,同时也可以看到具体有哪些内置的信号。

一般安装Flask时会自动安装blinker,如果没有安装通过pip安装即可:pip install blinker。

为了更好的理解信号的具体操作,下面先看下怎么通过blinker自定义信号,再列出内置的信号。

blinker自定义信号

其实除非是使用内置的信号,否则使用自定义的信号感觉上作用类似公共函数,在需要的时候调用就行。以下为blinker自定义信号步骤:

  1. 创建命名空间:my_namespace=Namesapce(),可以创建多个命名空间。
  2. 创建信号:my_signal = my_namespace.signal('my_signal'),同一个命名空间中可以创建多个信号。
  3. 监听信号:my_signal.connect(my_func),当监听到信号后,会去执行指定的函数my_func,my_func函数定义的时候需要注意,必须指定参数sender(无论在函数中是否用到)。
  4. 发送信号:my_signal.send(),发送信号,此时会执行“监听信号”中指定的函数my_func,如果send方法中没有指定sender参数,那么my_func函数中的sender参数默认为None。

简单示例:

from flask import Flask, request, g

from signals import login_signal

app = Flask(__name__)

@app.route('/login/')
def login():
# 以查询字符串的方式获取用户名:http://127.0.0.1:5000/login/?username=xiaoming
username = request.args.get('username')
if username:
# 可以将信息存储在g对象中,然后在监听函数中直接使用g对象获取信息即可
g.username = username # 发送信号
login_signal.send() # 也可以通过指定参数名的方式传入,这种方式需要在监听函数中也定义好对应的参数
# login_signal.send(username=username) return '登录成功'
else:
return '请输入用户名!' if __name__ == '__main__':
app.run()

signals.py

from flask import g
from blinker import Namespace # 创建命令空间
login_namespace = Namespace() # 创建信号,如果已存在同名的信号,可以放在不同的命名空间中
login_signal = login_namespace.signal('login') # def print_login_info(sender, username):
# # 通过定义参数的方式获取信息
# print('[{}]登录成功!'.format(username)) # 定以监听函数,此函数必须要定义sender参数,无论此参数在函数中是否被用到
def print_login_info(sender):
# 通过g对象的方式获取信息
print('[{}]登录成功!'.format(g.username)) # 监听信号,并指定监听函数,此函数会在login_signal.send()方法调用后执行
login_signal.connect(print_login_info)

Flask内置信号

因为内置信号已经定义好了信号本身和对应的发送操作,所以在代码中只需要定义对应的监听操作即可,包括调用信号的`connect`方法和定义对应的监听函数。

如果想要看各个内置信号的监听函数的参数,可以通过将监听函数的参数定义为`*args`和`**kwargs`查看具体传入了哪些参数。

  • template_rendered:模板渲染完成后会发送的信号。
  • before_render_template:模板渲染之前会发送的信号。
  • request_started:请求开始后会发送的信号。
  • request_finished:请求完成后会发送的信号。
  • request_tearing_down:request对象被销毁后会发送的信号。
  • got_request_exception:请求发生异常时(包括视图函数内发生的异常)会发送的信号。经常会监听这个信号,用来记录网站的异常信息。
  • appcontext_tearing_down:app上下文对象被销毁后会发送的信号。
  • appcontext_pushed:app上下文对象被推入栈中后会发送的信号。
  • appcontext_popped:app上下文对象被移出栈中后会发送的信号。
  • message_flashed:调用了Flask的`flasked`方法后会发送的信号。

Flask笔记:信号机制的更多相关文章

  1. Inside Flask - signal 信号机制

    Inside Flask - signal 信号机制 singal 在平常的 flask web 开发过程中较少接触到,但对于使用 flask 进行框架级别的开发时,则必须了解相关的工作机制.flas ...

  2. 3分钟看懂Python后端必须知道的Django的信号机制!

    概念 django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者( ...

  3. Flask 的 Context 机制

    转自https://blog.tonyseek.com/post/the-context-mechanism-of-flask/ Flask 的 Context 机制 2014 年 07 月 21 日 ...

  4. linux信号机制与python信号量

    1.信号本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是进程间 ...

  5. linux信号机制 - 用户堆栈和内核堆栈的变化【转】

    转自:http://itindex.net/detail/16418-linux-%E4%BF%A1%E5%8F%B7-%E5%A0%86%E6%A0%88 此文只简单分析发送信号给用户程序后,用户堆 ...

  6. 利用linux信号机制调试段错误(Segment fault)

    在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...

  7. Django的信号机制

    Django提供一种信号机制.其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) .当发生一些动作的时候,发出信号,然后监听了这个信号的callback函数就会执行. Djang ...

  8. linux中的信号机制

    概述 Linux信号机制是在应用软件层次上对中断机制的一种模拟,信号提供了一种处理异步事件的方法,例如,终端用户输入中断键(ctrl+c),则会通过信号机制停止一个程序[1]. 这其实就是向那个程序( ...

  9. Linux信号机制

    Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...

随机推荐

  1. IT兄弟连 HTML5教程 CSS3揭秘 在HTML文档中放置CSS的几种方式

    有很多方法将样式表加入到HTML中,每种方法都有自己的优点和缺点.新的HTML元素和属性已被加入,以允许样式表与HTML文档更简易地组合起来.将样式表加入到HTML中的常用方法有内联样式表.嵌入一张样 ...

  2. Maven使用之packaging类型

    项目的打包类型:pom.jar.war 项目中一般使用maven进行模块管理,每个模块下对应都有一个pom文件,pom文件中维护了各模块之间的依赖和继承关系.项目模块化可以将通用的部分抽离出来,方便重 ...

  3. 利用Python制作一个只属于和她的聊天器,再也不用担心隐私泄露啦!

    ------------恢复内容开始------------ 是否担心微信的数据流会被监视?是否担心你和ta聊天的小秘密会被保存到某个数据库里?没关系,现在我们可以用Python做一个只属于你和ta的 ...

  4. .WrongArgumentException: Malformed database URL, failed to parse the connection string near ';characterEncoding=UTF-8&;serverTimezone=Asia/Shanghai'.)

    连接mysql库报的异常信息: org.springframework.transaction.CannotCreateTransactionException: Could not open JDB ...

  5. 数据库在线导出工具:Adminer

    数据库在线导出工具:Adminer Adminer是一个类似PhpMyAdmin的MySQL客户端的"页面PHP",它只有一个PHP文件,包括:数据库的普通和函数操作等功能,是一个 ...

  6. OpenCV:增加和减少图像的亮度,图像的加减法

    首先导包: import numpy as np import cv2 import matplotlib.pyplot as plt def show(image): plt.imshow(imag ...

  7. vscode中js文件失去高亮/没有智能提示

    vscode中js文件失去高亮/没有智能提示 两步: 第一步:基本的语法高亮提示,需要将vetur删掉,然后把vscode的历史记录缓存删掉,重启vscode. 第二步:js的智能提示,使用插件typ ...

  8. RHEL 6.6配置网易CentOS镜像的yum源小结

       之前没有使用过网易CentOS镜像的yum源,最近由于需要,遂在一台测试服务器验证.测试了一下如何配置使用网易的Cent0S的yum源.此文仅仅是笔记性质,参考了网上大量资料(文末"参 ...

  9. GCN 实现3 :代码解析

    1.代码结构 ├── data // 图数据 ├── inits // 初始化的一些公用函数 ├── layers // GCN层的定义 ├── metrics // 评测指标的计算 ├── mode ...

  10. Linux-3.14.12内存管理笔记【构建内存管理框架(5)】

    前面已经分析了内存管理框架的构建实现过程,有部分内容未完全呈现出来,这里主要做个补充. 如下图,这是前面已经看到过的linux物理内存管理框架的层次关系. 现着重分析一下各个管理结构体的成员功能作用. ...