信号

Flask 框架中的信号基于blinker,其只要就是让开发者可以在flak请求过程中制定一些用户行为
安装:pip3 install blinker

内置信号

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在其中添加数据时,自动触发
# 第一步:编写函数
def fun(*args,**kwargs):
    print('触发信号',args,kwargs)
# 第二步:注册信号
# signals.request_started.connect(func)
signals.request_finished.connect(func)

自定义信号

# 第一步:定义信号
a = _signals.signal('aaa')
# 第二步:编写函数,绑定信息
def func(*args, **kwargs):
    print('信号', args, kwargs)
# 第三步:绑定函数
a.connect(func)
# 触发信号:在视图函数中
a.send('1111', k1='v1')

多app应用

from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.serving import run_simple
from flask import Flask, current_app

app1 = Flask('app01')
app2 = Flask('app2')


@app1.route('/index')
def index():
    return 'app01'


@app2.route('/index2')
def index2():
    return 'app02'


dm = DispatcherMiddleware(app1, {
    '/sec': app2,
})

if __name__ == '__main__':
    run_simple('localhost', 5000, dm)
    # dm.__call__
    # 根据请求的路径,执行不同app的__call__方法

flask-script

from flask import Flask
from flask_script import Manager

app = Flask(__name__)

manager = Manager(app)


# 自定制命令

@manager.command
def custom(arg):
    '''
    自定义命令
    python manage.py custom 123
    :param arg:
    :return:
    '''
    print(arg)


@manager.option('-n', '--name', dest='name')
@manager.option('-u', '--url', dest='url')
def cmd(name, url):
    '''
    自定义命令(-n也可以写成--name)\
    执行:python manage.py cmd -n xxx -u https://www.baidu.com/
    执行:python manage.py cmd --name xxx --url https://www.baidu.com/
    :param name:
    :param url:
    :return:
    '''
    print(name, url)


@app.route('/')
def index():
    return 'index'


if __name__ == '__main__':
    manager.run()

 posted on 2019-07-20 22:08  HeiTangMuSi  阅读(147)  评论(0编辑  收藏  举报