一、flask信号
1、信号库依赖
运行依赖一个基于python的信号库blinker:
pip install blinker
2、内置信号介绍:
request_started = _signals.signal('request-started') # 请求到来前执行
request_finished = _signals.signal('request-finished') # 请求结束后执行
before_render_template = _signals.signal('before-render-template') # 模板渲染前执行
template_rendered = _signals.signal('template-rendered') # 模板渲染后执行
got_request_exception = _signals.signal('got-request-exception') # 请求执行出现异常时执行
request_tearing_down = _signals.signal('request-tearing-down') # 请求执行完毕后自动执行(无论成功与否)
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 应用上下文执行完毕后自动执行(无论成功与否)
appcontext_pushed = _signals.signal('appcontext-pushed') # 应用上下文push时执行
appcontext_popped = _signals.signal('appcontext-popped') # 应用上下文pop时执行
message_flashed = _signals.signal('message-flashed') # 调用flask在其中添加数据时,自动触发
3、信号可以干什么
让开发者可以在请求过程中定制一些用户行为:
- 记录日志(某个表新增了数据,记录日志,某个表删除了数据。。。)
- 更新缓存(假设给article表数据加了缓存,一旦该表插入数据,一旦触发article表新增数据的信号,删除缓存,重新生成缓存(同步的话速度稍微慢一些,结合celery,异步生成缓存))
4、内置信号的使用
# 第一步:定义要给函数
# 第二步:跟信号绑定
信号.connect(函数内存地址)
# 第三步:触发信号(内置信号自动触发)
示例:
from flask import Flask, signals, render_template
app = Flask(__name__)
# 定义一个函数
def before_request_signal(*args, **kwargs):
print(args)
print(kwargs)
print('模板渲染了,触发了这个信号')
# 跟信号绑定
signals.request_started.connect(before_request_signal)
# 第三步:触发信号(不需要手动触发,请求走到这,就会触发)
@app.route('/')
def hello():
return render_template('index.html')
if __name__ == '__main__':
app.run()
5、自定义信号
from flask import Flask, signals, render_template
from flask.signals import _signals
app = Flask(__name__)
# 第一步:定义信号
cc = _signals.signal('cc')
# 第二步:写好函数
def before_request_signal(*args, **kwargs):
print(args)
print(kwargs)
print('触发了自定义的cc信号')
# 第三步:跟自己写的信号绑定
cc.connect(before_request_signal)
# 第四步:触发信号(自定义信号,要自己手动触发)
@app.route('/')
def hello_world():
res = render_template('index.html')
# 在模板渲染之后,手动触发自定义的cc信号
cc.send('sss', name='cc')
return res
if __name__ == '__main__':
app.run()
二、多app应用(了解即可,新版本已经不适用)
# 多app应用,在一个flask项目中,可以有多个app对象
# 版本依赖: werkzeug: 0.16.1及之前的版本才支持
from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.serving import run_simple
from flask import Flask, current_app
app1 = Flask(__name__)
app2 = Flask(__name__)
@app1.route('/index1')
def index1():
return 'app01'
@app2.route('/index2')
def index2():
return 'app02'
dm = DispatcherMiddleware(app1, {'/pro': app2})
if __name__ == '__main__':
run_simple('localhost', 5000, dm)
# 当请求来了:dm()-->DispatcherMiddleware的__call__