08 Flask源码剖析之flask拓展点

1. 信号(源码)

  • 信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作。

    pip3 install blinker

2. 根据flask项目的请求流程来进行设置扩展点

  • 中间件

    # 代码示例
    
    from flask import Flask,render_template
    
    app = Flask(__name__)
    
    @app.route('/index')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    return render_template('order.html') class MyMiddleware(object):
    def __init__(self,old_app):
    self.wsgi_app = old_app.wsgi_app def __call__(self, *args, **kwargs):
    print('123')
    result = self.wsgi_app(*args, **kwargs)
    print('456')
    return result app.wsgi_app = MyMiddleware(app) if __name__ == '__main__':
    app.run()
  • 当app_ctx被push到local中栈之后,会触发appcontext_pushed信号,之前注册在这个信号中的方法,就会被执行。

    # 代码示例
    
    from flask import Flask,render_template
    from flask import signals app = Flask(__name__) @signals.appcontext_pushed.connect
    def f1(arg):
    print('appcontext_pushed信号f1被触发',arg) @signals.appcontext_pushed.connect
    def f2(arg):
    print('appcontext_pushed信号f2被触发',arg) @app.route('/index')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    return render_template('order.html') if __name__ == '__main__':
    app.run()
    # app.__call__
  • 执行before_first_request扩展

    # 代码示例
    
    from flask import Flask,render_template
    
    app = Flask(__name__)
    
    @app.before_first_request
    def f2():
    print('before_first_requestf2被触发') @app.route('/index')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • request_started信号

    # 代码示例
    
    from flask import Flask,render_template
    from flask import signals
    app = Flask(__name__) @signals.request_started.connect
    def f3(arg):
    print('request_started信号被触发',arg) @app.route('/index')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • url_value_processor

    # 代码示例
    
    from flask import Flask,render_template,g
    from flask import signals
    app = Flask(__name__) @app.url_value_preprocessor
    def f5(endpoint,args):
    print('f5') @app.route('/index/')
    def index():
    print('index')
    return render_template('index.html') @app.route('/order')
    def order():
    print('order')
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • before_reuqest

    # 代码示例
    
    from flask import Flask,render_template,g
    from flask import signals
    app = Flask(__name__) @app.before_request
    def f6():
    g.xx = 123
    print('f6') @app.route('/index/')
    def index():
    print('index')
    return render_template('index.html') @app.route('/order')
    def order():
    print('order')
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • 视图函数

  • before_render_template / rendered_template

    # 代码示例
    
    from flask import Flask,render_template,g
    from flask import signals
    app = Flask(__name__) @signals.before_render_template.connect
    def f7(app, template, context):
    print('f7') @signals.template_rendered.connect
    def f8(app, template, context):
    print('f8') @app.route('/index/')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    print('order')
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • after_request

    # 代码示例
    
    from flask import Flask,render_template,g
    from flask import signals
    app = Flask(__name__) @app.after_request
    def f9(response):
    print('f9')
    return response @app.route('/index/')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    print('order')
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • request_finished

    # 代码示例
    
    from flask import Flask,render_template,g
    from flask import signals
    app = Flask(__name__) @signals.request_finished.connect
    def f10(app,response):
    print('f10') @app.route('/index/')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    print('order')
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • got_request_exception

    # 代码示例
    
    from flask import Flask,render_template,g
    from flask import signals
    app = Flask(__name__) @app.before_first_request
    def test():
    int('asdf') @signals.got_request_exception.connect
    def f11(app,exception):
    print('f11') @app.route('/index/')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    print('order')
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • teardown_request

    # 代码示例
    
    from flask import Flask,render_template,g
    from flask import signals
    app = Flask(__name__) @app.teardown_request
    def f12(exc):
    print('f12') @app.route('/index/')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    print('order')
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • request_tearing_down

    # 代码示例
    
    from flask import Flask,render_template,g
    from flask import signals
    app = Flask(__name__) @signals.request_tearing_down.connect
    def f13(app,exc):
    print('f13') @app.route('/index/')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    print('order')
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • appcontext_popped

    # 代码示例
    
    from flask import Flask,render_template,g
    from flask import signals
    app = Flask(__name__) @signals.appcontext_popped.connect
    def f14(app):
    print('f14') @app.route('/index/')
    def index():
    return render_template('index.html') @app.route('/order')
    def order():
    print('order')
    return render_template('order.html') if __name__ == '__main__':
    app.run()
  • 扩展:flash

    flash存值之后只能取一次

    # 代码示例
    
    from flask import Flask,render_template,flash,get_flashed_messages,session
    from flask import signals
    app = Flask(__name__)
    app.secret_key = 'iuknsoiuwknlskjdf' @app.route('/index/')
    def index():
    # flash('123')
    session['k1'] = 123
    return render_template('index.html') @app.route('/order')
    def order():
    # messages = get_flashed_messages()
    # print(messages)
    val = session['k1']
    del session['k1']
    print(val)
    return render_template('order.html') if __name__ == '__main__':
    app.run()

总结:

  • 关于flask内部共有14+个扩展点用于我们对flask框架内部进行定制,其中有:9个是信号。
# 源码示例

template_rendered = _signals.signal("template-rendered")
before_render_template = _signals.signal("before-render-template")
request_started = _signals.signal("request-started")
request_finished = _signals.signal("request-finished")
request_tearing_down = _signals.signal("request-tearing-down")
got_request_exception = _signals.signal("got-request-exception")
appcontext_tearing_down = _signals.signal("appcontext-tearing-down")
appcontext_pushed = _signals.signal("appcontext-pushed")
appcontext_popped = _signals.signal("appcontext-popped") message_flashed = _signals.signal("message-flashed")

08 Flask源码剖析之flask拓展点的更多相关文章

  1. 02 flask源码剖析之flask快速使用

    02 flask快速使用 目录 02 flask快速使用 1.flask与django的区别 2. 安装 3. 依赖wsgi Werkzeug 4. 快速使用flask 5. 用户登录&用户管 ...

  2. flask源码剖析系列(系列目录)

    flask源码剖析系列(系列目录) 01 flask源码剖析之werkzurg 了解wsgi 02 flask源码剖析之flask快速使用 03 flask源码剖析之threading.local和高 ...

  3. flask 源码剖析

    flask 上下文管理源码流程及涉及的部分技术点 [flask源码梳理]之一  偏函数_mro [flask源码梳理]之二  面向对象中__setattr__ [flask源码梳理]之三  Local ...

  4. 08 jwt源码剖析

    08 jwt源码剖析 目录 08 jwt源码剖析 1. jwt认证流程 2.jwt创建token 2.1 原理 2.2 jwt校验token 3. jwt使用 4. 源码剖析 总结: JSON Web ...

  5. Flask源码剖析详解

    1. 前言 本文将基于flask 0.1版本(git checkout 8605cc3)来分析flask的实现,试图理清flask中的一些概念,加深读者对flask的理解,提高对flask的认识.从而 ...

  6. 04 flask源码剖析之LocalStack和Local对象实现栈的管理

    04 LocalStack和Local对象实现栈的管理 目录 04 LocalStack和Local对象实现栈的管理 1.源码入口 1. flask源码关于local的实现 2. flask源码关于l ...

  7. 05 flask源码剖析之配置加载

    05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...

  8. 06 flask源码剖析之路由加载

    06 Flask源码之:路由加载 目录 06 Flask源码之:路由加载 1.示例代码 2.路由加载源码分析 1.示例代码 from flask import Flask app = Flask(__ ...

  9. 07 flask源码剖析之用户请求过来流程

    07 Flask源码之:用户请求过来流程 目录 07 Flask源码之:用户请求过来流程 1.创建ctx = RequestContext对象 2. 创建app_ctx = AppContext对象 ...

随机推荐

  1. Alink漫谈(七) : 如何划分训练数据集和测试数据集

    Alink漫谈(七) : 如何划分训练数据集和测试数据集 目录 Alink漫谈(七) : 如何划分训练数据集和测试数据集 0x00 摘要 0x01 训练数据集和测试数据集 0x02 Alink示例代码 ...

  2. [noi.ac省选模拟赛]第12场题解集合

    题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...

  3. excel如何快速计算日期对应的生肖?

      是否可以根据日期统计出生肖? 牛闪闪想应该可以吧!结果搜到了一个巨牛无比的公式. =MID("猴鸡狗猪鼠牛虎兔龙蛇马羊",MOD(YEAR(B2),12)+1,1), 利用年份 ...

  4. (七)四种常见的post请求中的参数形式

    原文链接:https://blog.csdn.net/jiadajing267/article/details/87883725 1).HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP ...

  5. loadrunner安装负载机

    1,安装docker 2,下载最新版本的load_generator镜像,命令如下: docker pull hpsoftware/load_generator 3,load_generator镜像实 ...

  6. 机器学习——打开集成方法的大门,手把手带你实现AdaBoost模型

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第25篇文章,我们一起来聊聊AdaBoost. 我们目前为止已经学过了好几个模型,光决策树的生成算法就有三种.但是我们每 ...

  7. JS新界面关闭原界面刷新的多种形式

    ------------恢复内容开始------------ 1.新界面为当前界面弹出的形式: 第一步:首先原界面的原生JS事件需要放到 (function () {  ......  })(); 中 ...

  8. java 中的线程池

    1.实现下面的一个需求,控制一个执行函数只能被五个线程访问 package www.weiyuan.test; public class Test { public static void main( ...

  9. Python三大器之装饰器

    Python三大器之装饰器 开放封闭原则 一个良好的项目必定是遵守了开放封闭原则的,就比如一段好的Python代码必定是遵循PEP8规范一样.那么什么是开放封闭原则?具体表现在那些点? 开放封闭原则的 ...

  10. Docker(五)Docker镜像讲解

    Docker镜像讲解 镜像概念 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 Dock ...