Flask 第十七话之信号
一、安装:默认跟随flask一起安装
pip install blinker
二、自定义信号
第一步:定义信号
from blinker import Namespace ns = Namespace() fire_signal = ns.signal('fire')
第二步:监听信号
def fire_func(sender): print("发送信号者",sender) print("触发了fire_signal信号") fire_signal.connect(fire_func)
第三步:发送信号
fire_signal.send()
举个梨子:登陆信息记录
app.py
from flask import Flask,request,g import signals app = Flask(__name__) @app.route('/login') def login(): u = request.args.get('u') if u: g.u = u signals.login_signal.send() return '登陆成功' return '登陆失败' @app.route('/') def index(): return '首页' if __name__ == '__main__': app.run(debug=True)
signals.py
from blinker import Namespace from datetime import datetime from flask import request,g # 创建信号 ns = Namespace() login_signal = ns.signal('login') def login_log(sender): now = datetime.now() ip = request.remote_addr print("用户:{}于北京时间:{}使用IP地址:{}登陆了网站".format(g.u,now,ip)) # 监听信号 login_signal.connect(login_log)
三、内置信号
1.template_rendered :模板渲染完成后的信号
2.before_render_template:模板渲染之前的信号
3.request_started:模板开始渲染
4.request_finished :模板渲染完成
5.request_tearing_down :request对象被摧毁的信号
6.got_request_exception :视图函数发生异常的信号,一般可以监听这个信号来记录网站异常信息
7.appcontext_tearing_down :app上下文被摧毁的信号
8.appcontext_pushed :app上下文被推入到栈中的信号
9.appcontext_popped :app上下文被推出栈中的信号
10.message_flashed :调用了flask的`flashed`的信号
举个梨子
from flask import Flask,template_rendered,render_template,got_request_exception app = Flask(__name__) def template_rendered_func(sender,template,context): """ sender: <Flask 'app5'> template: <Template 'index.html'> context: {'a': 'aaa', 'g': <flask.g of 'app5'>, 'request': <Request 'http://127.0.0.1:5000/' [GET]>, 'session': <NullSession {}>} """ print("sender:",sender) print("template:",template) print("context:",context) template_rendered.connect(template_rendered_func) def got_request_exception_func(sender,*args,**kwargs): """ sender: <Flask 'app5'> args: () kwargs: {'exception': ZeroDivisionError('division by zero')} """ print("sender:", sender) print("args:", args) print("kwargs:", kwargs) got_request_exception.connect(got_request_exception_func) @app.route('/') def index(): a = 1/0 return render_template('index.html',a=a) if __name__ == '__main__': app.run(debug=True)