zoukankan      html  css  js  c++  java
  • 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...
    

      

  • 相关阅读:
    GPON和820.1p学习及资料(zt)
    modelsim(3)
    JTAG 学习 -SVF格式
    看来人工智能不可阻挡,将和网络与计算机一样服务于各行各业!
    【管理心得之二十六】职场中的“武功”
    【管理心得之二十五】组织中的骂名 ----------墙头草
    【管理心得之二十四】成功乃失败之母
    【管理心得之二十三】道是道,非常道。名可名,非常名。
    【管理心得之二十二】小人物 仰视 大授权
    【管理心得之二十一】管得少就是管得好
  • 原文地址:https://www.cnblogs.com/Yunya-Cnblogs/p/14280010.html
Copyright © 2011-2022 走看看