08. flask信号、多app应用

一、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__
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值