zoukankan      html  css  js  c++  java
  • Flask--信号 blinker

    Flask--信号 blinker

    Flask框架中的信号基于blinker,可以让开发者在flask请求过程中 定制一些用户行为执行。
    
    在请求前后,模板渲染前后,上下文前后,异常 的时候

    安装:

    pip install blinker

    1 Flask的内置信号:

        内部通过 send方法 触发信号
    
        2     request_started = _signals.signal('request-started')  # 请求到来前执行
        5     request_finished = _signals.signal('request-finished')  # 请求结束后执行
    
        3     before_render_template = _signals.signal('before-render-template')  # 模板渲染前执行
        4     template_rendered = _signals.signal('template-rendered')  # 模板渲染后执行
    
        0    got_request_exception = _signals.signal('got-request-exception')  # 请求执行出现异常时执行
    
        6     request_tearing_down = _signals.signal('request-tearing-down')  # 请求执行完毕后自动执行(无论成功与否)
        7     appcontext_tearing_down = _signals.signal('appcontext-tearing-down')  # 请求上下文执行完毕后自动执行(无论成功与否)
    
        1     appcontext_pushed = _signals.signal('appcontext-pushed')  # 请求上下文push时执行,一般用不到
        8     appcontext_popped = _signals.signal('appcontext-popped')  # 请求上下文pop时执行
    
    
        message_flashed = _signals.signal('message-flashed')  # flash消息的时候--  调用flask在其中添加数据时,自动触发

    补充:Django的信号

    Model signals      # ORM 操作的时候触发
    
        pre_init                    # django的modal执行其构造方法前,自动触发
        post_init                   # django的modal执行其构造方法后,自动触发
        pre_save                    # django的modal对象保存前,自动触发
        post_save                   # django的modal对象保存后,自动触发
        pre_delete                  # django的modal对象删除前,自动触发
        post_delete                 # django的modal对象删除后,自动触发
        m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
        class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
    
    Management signals       
    
        pre_migrate                 # 执行migrate命令前,自动触发
        post_migrate                # 执行migrate命令后,自动触发
    
    Request/response signals    
    
        request_started             # 请求到来前,自动触发
        request_finished            # 请求结束后,自动触发
        got_request_exception       # 请求异常后,自动触发
    
    Test signals
    
        setting_changed             # 使用test测试修改配置文件时,自动触发
        template_rendered           # 使用test测试渲染模板时,自动触发
    
    Database Wrappers
    
        connection_created          # 创建数据库连接时,自动触发

    使用:

    from django.core.signals import request_finished
    from django.core.signals import request_started
    from django.core.signals import got_request_exception
    
    from django.db.models.signals import class_prepared
    from django.db.models.signals import pre_init, post_init
    from django.db.models.signals import pre_save, post_save
    from django.db.models.signals import pre_delete, post_delete
    from django.db.models.signals import m2m_changed
    from django.db.models.signals import pre_migrate, post_migrate
    
    from django.test.signals import setting_changed
    from django.test.signals import template_rendered
    
    from django.db.backends.signals import connection_created
    
    
    def callback(sender, **kwargs):
        print("xxoo_callback")
        print(sender,kwargs)
    
    信号.connect(callback)

    自定义信号

    a. 定义信号
    
        import django.dispatch
        pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
    
    b. 注册信号
    
        def callback(sender, **kwargs):
            print("callback")
            print(sender,kwargs)
     
        pizza_done.connect(callback)
        
    c. 触发信号
    
        from 路径 import pizza_done
         
        pizza_done.send(sender='seven',toppings=123, size=456)

    2 特殊装饰器 与 信号的区别

    信号的功能 都可以 通过扩展实现
    
    区别:
    
        1  返回值:注册到信号的函数,没有返回值, 只执行自定义操作
    
        2  自定义信号,可以降低代码的耦合

    3 自定义信号的实现:( 发送消息 )

    def QQ(*args,**kwargs):
        pass
    
    def WX(*args,**kwargs):
        pass
    
    from flask.signals import _signals
    
    MSG = _signals.signal('MSG')                           #   创建信号
    MSG.connect(QQ)                                     #  注册
    MSG.connect(WX)            
    
    
    @app.route('/',methods=['GET','POST'],endpoint='index')
    def index():
        MSG.send(sender='xxx',a=1,b=2)           # 触发
            return render_template('login.html')
    
    if __name__ == '__main__':
        app.run()

    使用例子:

    关于请求进来 >>.先执行 扩展的装饰器 before_first_request >> 然后request_start信号 >> 然后 before_request , 然后视图
    
    @app.before_first_request
    def sayhello():
        print('hello11')
    
    def test(*args,**kwargs):
        print('test22')
    
    from flask.signals import request_started
    
    request_started.connect(test)
    
    @app.route('/',methods=['GET','POST'],endpoint='index')
    def index():
        return 'hello333'
    
    if __name__ == '__main__':
        app.run()
  • 相关阅读:
    Python 学习笔记 11.模块(Module)
    Python 学习笔记 8.引用(Reference)
    Python 学习笔记 9.函数(Function)
    Python 学习笔记 6.List和Tuple
    Python 学习笔记 4.if 表达式
    Python 学习笔记 2.自省
    Python 学习笔记 3.简单类型
    Python 学习笔记 7.Dictionary
    Python 学习笔记 5.对象驻留
    Python 学习笔记 10.类(Class)
  • 原文地址:https://www.cnblogs.com/ExMan/p/9875931.html
Copyright © 2011-2022 走看看