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)

 

posted @ 2020-03-15 15:09  我在地球凑人数的日子  阅读(119)  评论(0编辑  收藏  举报