• 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)
  • 相关阅读:
    简单工厂模式
    单例模式
    Quartz.NET总结(三)Quartz 配置
    Quartz.NET总结(二)CronTrigger和Cron表达式
    ORACLE跨数据库查询的方法
    github使用个人总结
    ffmpeg 下载安装和简单应用
    Python 安装与环境变量配置
    Sublime text 3 汉化教程
    给大家分享两套WordPress收费主题
  • 原文地址:https://www.cnblogs.com/lee-xingxing/p/12497696.html
Copyright © 2020-2023  润新知