Flask 信号机制

Flask信号

   同Django一样,Flask也提供了信号机制。

   即在特定的时间地点执行某一函数。

   比如MySQL中某张表添加了新的记录,我们希望Redis中也进行更新,就可以使用自定义信号来完成。

   Flask中的信号与中间件有一些相似之处,但是本质的工作范畴截然不同,不要将他们混淆:

  1. Flask中的中间件的目的是拦截请求或定义一些全局操作,这些中间件共同特性都是具有返回值的
  2. 信号是在某个特殊情况发生后,进行额外的操作,对代码进行解耦合,一般来说不会对其设置返回值

   要想使用Flask信号,必须安装模块:

pip3 install blinker

内置信号

信号大全

   以下是所有的内置信号:

信号描述
request_started 请求到来前执行
request_finished 请求结束后执行
before_render_template 模板渲染前执行
template_rendered 模板渲染后执行
got_request_exception 请求执行出现异常时执行
request_tearing_down 请求执行完毕后自动执行(无论成功与否)
appcontext_tearing_down 应用上下文执行完毕后自动执行(无论成功与否)
appcontext_pushed 应用上下文push时执行
appcontext_popped 应用上下文pop时执行
message_flashed 向闪现消息中添加数据时,自动触发

使用案例

   以下是基本的使用案例:

import flask
from flask import signals

app = flask.Flask(__name__)

# 导入信号,注册回调函数
@signals.request_started.connect
def func(*args,**kwargs):
    print("请求到来了...")
    print(args)  # (<Flask 'flask信号'>,)
    print(kwargs)  # {}

# 第二种注册方式
# signals.request_started.connect(func)

# 请求到来前先执行信号
@app.route('/index')
def index():
    return "ok!!!"

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

自定义信号

基本使用

   自定义信号的使用:

import flask
from flask.signals import _signals

app = flask.Flask(__name__)

# 定义信号
comm_signals = _signals.signal("comm_signals")

# 注册回调函数
@comm_signals.connect
def func(*args, **kwargs):
    print("来信号了...")
    print(args)  # ('xxx',)
    print(kwargs)  # {}

@app.route('/index')
def index():
    # 发送信号
    comm_signals.send("xxx")
    return "ok!!!"

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

多信号执行顺序

   当有一个信号进行注册多个回调函数时,按照注册顺序进行执行:

import flask
from flask import signals

app = flask.Flask(__name__)

# 导入信号,注册回调函数
@signals.request_started.connect
def func1(*args,**kwargs):
    print("func1...")


@signals.request_started.connect
def func2(*args,**kwargs):
    print("func2...")


# 请求到来前先执行信号
@app.route('/index')
def index():
    return "ok!!!"

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

   运行结果:

func1...
func2...

  

posted @ 2021-01-14 23:24  云崖先生  阅读(235)  评论(0编辑  收藏  举报