flask 信号

1 第一步 创建信号

flask的signal机制由blinker库提供。想使用信号,需要首先安装blinker这个库,安装方法不再赘述,这是python基础。

from blinker import Namespace    #导入模块
my_signals=Namespace()           #创建命名空间,作用是可创建并存储多个信号发射对象
model_saved=my_signals.signal('model_saved')    #创建一个信号发射对象,并赋予它一个<strong>独一无二</strong>的名字

这是官网给的栗子。我们创建了一个信号发送对象model_saved,此时应注意,model_saved并不是发送者,信号的发送者是应用本身,即app,不理解也没关系,将model_saved看做一个载体好了。

至于命名空间my_signals,在应用里,你可能需要不止一个信号,比如当缓存变化的时候,我需要一个信号;当有用户登陆的时候,我需要一个信号……等,这时候你就可以通过my_signals建立其余的信号发射对象,如model_saved2,model_saved3……

2 第二步 发送信号

信号的发送很简单,信号发送对象的send()函数即可搞定。

from flask import Flask
app=Flask(__name__)          #建立一个应用对象:app
model_saved.send(app,data1='A Signal',data2={1:1})   #发送信号。第一个参数app,代表发送者    
                                                     #后面的参数data1,data2 为发送的数据

这里发送了两个数据:data1,data2,好比字典对象的键值对,data1对应的值是一个字符串,data2对应的值是一个字典,你可以多发些数据,data3、data4之类的,跟在后面就好了。你可以把发送信号的语句放在任何可以触发的地方,比如,我想让用户每个访问首页的动作,都发送一个信号:

发送信号

@app.route('/')
def index():
    model_saved.send(app,data1='A Signal',data2={1:1})    #发送了信号
    return '信号已经发送'

这样子,只要访问‘/’这个路由,就会发送一次信号。

3 第三步 信号接收

发出去的信号没人收,不就没效果了吗?blinker提供了一个叫做信号接收装饰器的东西:connect_via(),有了它,可以很方便地接收信号。

接收信号

@model_saved.connect_via(app)           #装饰器,接收app通过model_saved发送而来的信号
def signal_recv(app,data1,data2):       #第一个参数app代表发送者,后面的参数为接收到的数据的键所对应的值
    print('信号接收函数:{0},{1}'.format(data1,data2))
    pass

在接收函数参数里,键data1,data2不能随便定义,应与发送函数的键保持一致。如这里修改成data3,data4,就会爆出错误的。

扫描二维码关注公众号,回复: 3252330 查看本文章

栗子里接收到信号数据后,打印了一下,直接pass掉了,但实际应用中,肯定不会这么简单。

4 第四部 运行

if __name__=="__main__":
    app.run(debug=True)

运行服务在默认的5000端口。你会发现,每访问一下‘/’,都会触发信号发送,接收,并将数据打印出来这整个过程,试一下吧。

猜你喜欢

转载自www.cnblogs.com/deepvoice/p/9668419.html
今日推荐