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...
    

      

  • 相关阅读:
    PHP深入浅出之命名空间(Namespace)的使用详解
    函数func_get_args详解
    验证码封装类
    PHP中SESSION自定义会话管理器
    网页开发常见问题总结
    mysql远程连接只显示部分数据库问题
    认识和学习bash
    IPv6地址格式示例及IPv6与IPv4的区别分析
    用HTTP核心模块配置一个静态Web服务器
    Nginx服务项的基本配置
  • 原文地址:https://www.cnblogs.com/Yunya-Cnblogs/p/14280010.html
Copyright © 2011-2022 走看看