zoukankan      html  css  js  c++  java
  • 信号

    信号

    Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为

    安装: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在其中添加数据时,自动触发
    

    一个流程中的信号触发点

    1. before_first_request
    2. 触发 request_started 信号
    3. before_request
    4. 模板渲染
        渲染前的信号 before_render_template.send(app, template=template, context=context)
            rv = template.render(context) # 模板渲染
        渲染后的信号 template_rendered.send(app, template=template, context=context)
    5. after_request
    6. session.save_session()
    7. 触发 request_finished信号        
        如果上述过程出错:
            触发错误处理信号 got_request_exception.send(self, exception=e)
                
    8. 触发信号 request_tearing_down
    

    一、信号使用

    # 请求来触发
    from flask import Flask, signals
    
    app = Flask(__name__)
    
    
    # 向信号中注册函数
    def func(*args, **kwargs):
        print("触发信号", args, kwargs)
    
    
    # 请求来之前触发
    signals.request_started.connect(func)
    
    
    # 触发信号: signals.request_started.send()
    
    @app.before_first_request
    def request_first1(*args, **kwargs):
        pass
    @app.before_first_request
    def request_first2(*args, **kwargs):
        pass
    @app.before_request
    def request_first3(*args, **kwargs):
        pass
    
    
    @app.route('/', methods=['GET', "POST"])
    def index():
        print('视图')
        return "ok"
    
    
    if __name__ == '__main__':
        # app.__call__()
        app.run()
    
    

    1577673751426

    1577671938978

    二、自定义信号

    from flask import Flask, signals
    from flask.signals import _signals
    
    app = Flask(import_name=__name__)
    
    custom_signals = _signals.signal('custom')
    
    
    def func(*args, **kwargs):
        print("自定义信号11", args, kwargs)
    
    
    # 自定义信号注册
    custom_signals.connect(func)
    
    
    @app.route('/custom')
    def index():
        # 触发信号
        custom_signals.send("自定义信号", k=123)
    
        return '自定义信号'
    
    

    1577675421319

    总结:

    • 自定义信号必须要使用才可以触发
    • 系统中信号,会在固定时间点自动触发
  • 相关阅读:
    百万级数据迁移方案测评小记
    EFCore-一对一配置外键小记2
    mpvue实战-手势滑动导航栏
    React-Native WebView使用本地js,css渲染html
    Dubbo测试环境服务调用隔离这么玩对么
    Kitty中的动态线程池支持Nacos,Apollo多配置中心了
    嘘!异步事件这样用真的好么?
    一时技痒,撸了个动态线程池,源码放Github了
    熬夜之作:一文带你了解Cat分布式监控
    这个Maven依赖的问题,你敢说你没遇到过
  • 原文地址:https://www.cnblogs.com/randysun/p/15518268.html
Copyright © 2011-2022 走看看