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()
  • 相关阅读:
    Nodejs学习笔记
    Multiple SSH keys for different github accounts
    深入Node.js的模块机制
    Yoga S5
    Nodejs
    gulp & webpack整合
    git subtree:无缝管理通用子项目
    javascript功能插件大集合,写前端的亲们记得收藏
    Python简单的制作图片验证码
    用CSS3/JS绘制自己想要的按钮
  • 原文地址:https://www.cnblogs.com/big-handsome-guy/p/8551973.html
Copyright © 2011-2022 走看看