Flask信号

  1. 安装:flask中的信号使用的是一个第三方插件,叫做blinker.通过pip3.7 install blinker进行安装

  2. flask内置的9种信号

    • Flask中所有的内置信号 都是从from flask import 导入

      • 1.template_rendered: 模板渲染完成后的信号

      • 2.before_render_template:模板渲染之前的信号

      • 3.request_started: 模板开始渲染

      • 4.request_finished: 模板渲染完成

      • 5.request_tearing_down: request对象被销毁的信号

      • 6.got_request_excepetion: 视图函数发送异常的信号。一般可以监听这个信号,来记录网站异常信息

      • 7.appcontext_tearing_down: app上下文被销毁的信号

      • 8.appcontext_pushed: app上下文被推入到栈上的信号

      • 9.appcontext_popped: app上下文被推出栈中的信号

      • 10.message_flashed: 调用了Flask的‘flashed’方法的信号

    • 1.flask.template_rendered: 模板渲染完毕后发送 示例代码如下:

      • + from  flask  import template_rendered
        + def log_template_renders(sender,template,context,*args):
          + print('sender',sender)   **sender是当前这个app文件**
          + print('template',template)    监听到的模板的名称
          + print('context:',context)     
        + template_rendered.connect(log_template_renders,app)
    • 2.flask.request_started:请求开始之前,在到达视图函数之前发送,订阅者可以调用request之类的标准全局代理访问请求。 示例代码如下:

      • + def  log_request_started(sender,**extra):
          + print('sender',sender)
          + print('extra',extra)
        + request_started.connect(log_request_started,app)
    • 3.flask.got_request_exception: 在请求过程种抛出异常时发送,异常本身会通过exception传递到订阅的函数。示例代码如下

      • + def  log_exception_finished(sender,exception,*args)
          + print('sender',sender)
          + print(type(exception))
        + got_request_exception.connect(log_exception_finished,app)
    • 4.flask.request_tearing_down: 请求被销毁的时候发送,即使在请求过程中发送异常,也会发送,示例代码如下

      • + def log_request_tearing_down(sender,**kwargs):
          + print("coming...")
        + request_tearing_down.connect(log_request_tearing_down,app)
    • 5.flask.appcontext_tearing_down: 在应用上下文销毁的时候发送,它总是会被调用,即使发送异常。示例代码如下

      • + def log_appcontext_teating_down(sender,**kwargs):
          + print('coming...')
        + appcontext_tearing_down.connect(appcontext_tearing_down,app)
    • 6.自定义信号:自定义信号分为3步,第一步定义一个信号,第二是监听一个信号,第三是发送一个信号,以下将对这三步进行详解:

      • 1.定义信号:定义信号需要使用到blinker这个包的Namespace类来创建一个命名空间。比如定义一个在访问了某个视图函数的时候的信号。示例代码如下

        • #Namespace为了防止多人开发的时候。信号名字冲突的问题

        • + from blinker import Namespace
          + mysignal = Namespace()
          + visit_signal = mysignal.signal('visit-signal')
      • 2.监听信号:监听信号使用singal对象的connect方法。在这个方法中需要传递一个函数,用来接收以后监听到这个信号该做的事情。示例代码如下

        • + def visit_func(sender,username):  必须写sender这个参数
            + print(sender)
            + print(username)
            + request.remote_addr  可以获得用户的ip地址
          + visit_signal .connect(visit_func)
      • 3.发送信号:发送信号使用singal对象的send方法,这个方法可以传递一些其他参数过去。示例代码如下

        • visit_signal .send(username = 'xiaoxin')

        • 当创建的信号一旦被发送,就会 执行监听信号里面相对应的函数,而且发送信号传递过来的参数,监听信号里面的函数都能接受到

posted @ 2020-01-05 15:18  冬瓜先生  阅读(206)  评论(0)    收藏  举报