Flask信号
-
安装:flask中的信号使用的是一个第三方插件,叫做blinker.通过pip3.7 install blinker进行安装
-
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')
-
当创建的信号一旦被发送,就会 执行监听信号里面相对应的函数,而且发送信号传递过来的参数,监听信号里面的函数都能接受到
-
-
-

浙公网安备 33010602011771号