Flask信号
同Django
一样,Flask
也提供了信号机制。
即在特定的时间地点执行某一函数。
比如MySQL
中某张表添加了新的记录,我们希望Redis
中也进行更新,就可以使用自定义信号来完成。
Flask
中的信号与中间件有一些相似之处,但是本质的工作范畴截然不同,不要将他们混淆:
- Flask中的中间件的目的是拦截请求或定义一些全局操作,这些中间件共同特性都是具有返回值的
- 信号是在某个特殊情况发生后,进行额外的操作,对代码进行解耦合,一般来说不会对其设置返回值
要想使用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...