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

    总结:

    • 自定义信号必须要使用才可以触发
    • 系统中信号,会在固定时间点自动触发
  • 相关阅读:
    C#调用Delphi的dll 详解
    C# 用API截取桌面屏幕
    C# 控件代码设置置顶和置底属性
    C#用API 获取电脑桌面背景图地址
    利用JS使IE浏览器默认打开是全屏显示
    aspx页面生成xml数据
    MacOS下安装Anaconda+Pycharm+TensorFlow+Keras
    GitHub编辑README
    Win10(64位)下安装Anaconda+Tensorflow(GPU)
    Win7(64位)下安装Anaconda+Tensorflow(CPU)
  • 原文地址:https://www.cnblogs.com/randysun/p/15518268.html
Copyright © 2011-2022 走看看