• Flask快速入门(18) — 信号


    Flask快速入门(18) — 信号

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

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

    使用内置信号:

    from flask import Flask,signals
    app = Flask(__name__)
    # 往信号中注册函数,函数名任意
    def fun(*args,**kwargs):
        print('触发信号',args,kwargs)
    signals.request_started.connect(fun)
    
    @app.route('/')
    def index():
        print('我是请求')
        return 'ok'
    
    if __name__ == '__main__':
        app.run()
        
    # 在内部源码中,执行了 request_started.send(self)表示发送信号
    

    一个流程中的信号触发点(了解)

    a. before_first_request
    b. 触发 request_started 信号
    c. before_request
    d. 模板渲染
    	渲染前的信号 before_render_template.send(app, template=template, context=context)
    		rv = template.render(context) # 模板渲染
    	渲染后的信号 template_rendered.send(app, template=template, context=context)
    e. after_request
    f. session.save_session()
    g. 触发 request_finished信号		
    	如果上述过程出错:
    		触发错误处理信号 got_request_exception.send(self, exception=e)		
    h. 触发信号 request_tearing_down
    

    自定义信号:

    from flask import Flask, current_app, flash, render_template
    from flask.signals import _signals
    app = Flask(import_name=__name__)
    
    # 自定义信号
    xxxxx = _signals.signal('xxxxx')
    # 必须有一个位置参数,去接收他的发送者,
    def func(sender, *args, **kwargs):
        print(sender)
    # 自定义信号中注册函数
    xxxxx.connect(func)
    @app.route("/x")
    def index():
        # 触发信号,这里的第一个参数是发送者,第二个参数可选的话,必须是关键字参数
        xxxxx.send('123123', k1='v1')
        return 'Index' 
     
    if __name__ == '__main__':
        app.run()
    
  • 相关阅读:
    在UpdatePanel上使用FileUpload上传文件
    Android配置开发环境
    文件服务器共享目录设置(一)
    win2008R2的Hyperv安装Ubuntu
    Comodo Time Machine导致系统进不去
    sql2005生成sql2000脚本的时候出现“User.UserType: NoLogin 不是SQL Server 2005 的有效选项“ 的解决方案
    迅雷7偷偷上传文件导致机器变卡
    文件服务器共享目录设置(二)
    再谈Javascript原型继承
    a和a:link的区别
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11708177.html
Copyright © 2020-2023  润新知