flask signal信号机制

说明

参考: 信号
什么是信号?当核心框架的其他地方或另一个 Flask 扩展中发生动作时,信号通过发送 通知来帮助你解耦应用。简言之,信号允许某个发送者通知接收者有事情发生了。


案例

使用信号,分四个步骤处理

  1. 创建一个信号
  2. 创建接收到信号之后处理的回调函数
  3. 信号绑定回调函数
  4. 发送消息

创建一个信号

这里创建了一个mail_send的信号

1
2
3
4
5
6
7
8
from flask.signals import Namespace
from flask import Flask, current_app
my_signals = Namespace()
mail_send = my_signals.signal('mail-send')
app = Flask(__name__)

创建接收到信号之后处理的回调函数

回调函数为mail_send_callback(), 这里接收一个email的数据参数

1
2
3
4
5
6
7
8
def mail_send_callback(sender, email, **extra):
"""
:param sender: 发送者
:param email: 数据参数email
:param extra:
:return:
"""
print 'Got email: %s' % email

信号绑定回调函数 .connect()

需要把信号绑定回调函数,用于在接收信号之后的处理步骤.

1
2
3
4
5
mail_send.connect(mail_send_callback, app)
# 该方法的第一个参数是当信号发出时所调用的函数。第二个参数是可选参数,定义一个发送者。 使用 disconnect() 方法可以退订信号
# mail_sent_callback 为receiver, 一般是一个callback函数
# app: 为sender 发送者

发送消息 .send()

1
2
3
4
5
6
from flask import current_app
mail_send.send(current_app._get_current_object(), email=email)
# 它的第一个 参数是一个发送者`current_app._get_current_object()`,
其他参数要发送给订阅者的东西,其他参数是可选的,email=email为参数

完整的测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: YangCan
# Email: yoncan@qq.com
# About: https://yoncan.github.io
from flask import Flask, current_app, request, jsonify
from flask.signals import Namespace
app = Flask(__name__)
my_signals = Namespace()
mail_send = my_signals.signal('mail-sent')
def mail_send_callback(sender, email, **extra):
"""
:param sender:
:param email:
:param extra:
:return:
"""
print("sent mail to %s", email)
mail_send.connect(mail_send_callback, app)
@app.route('/', methods=['POST'])
def test_send_mail():
"""
:return:
"""
req_data = request.get_json()
email = req_data.get('email', None)
# 发送signal
mail_send.send(current_app._get_current_object(), email=email)
return jsonify({
'code': 0,
'msg': 'send to {0} ok '.format(email)
})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)

命令行测试

1
2
3
4
5
# curl -H "Content-Type: application/json" -XPOST http://192.168.10.1:8000/ -d '{"email": "yangcan@local"}'
{
"code": 0,
"msg": "send to yangcan@local ok "
}

在服务端,可以看到的输出

1
('sent mail to %s', u'yangcan@local')

分享即快乐,谢谢你请思哲小朋友吃糖!